一、UIView自定义视图


     因为在实际开发过程中,可能由于繁琐的创建相同的Label、textfield和Button组合,为了实现编程工作的高效率,我们可以自定义视图,并且将它们封装起来。


·  自定义视图步骤


     1. 创建一个 UIView 的子类
     2. 把想要的视图 在子类中创建并添加(在初始化方法中添加)

在需要的地方初始化子类的到想要的布局
 

  《《《《《《《《《头文件中》》》》》》》》》 

 
@interface 
  LTView : 
  UIView 
 
 
 // 
  创建属性 
   
  开放接口 
  方便外界访问 
 
 
 @property 
  ( 
 nonatomic 
 , 
 retain 
 ) 
 UILabel 
  *label;
 
 @property 
  ( 
 nonatomic 
 , 
 retain 
 ) 
 UITextField 
  *textField; 
@end
 

  《《《《《《《《《.m文件中》》》》》》》》》》》》》 

 
- ( 
 instancetype 
 )initWithFrame:( 
 CGRect 
 )frame
 
{
     
  self 
  = [ 
 super 
  initWithFrame 
 :frame];
     
  if 
  ( 
 self 
 ) {
         
  /**
          *  
  添加自定义视图的各种视图了 
 
          */ 
 
         
  // 
  得到宽度和高度 
 
         
  CGFloat 
  width = frame. 
 size 
 . 
 width 
 ;
         
  CGFloat 
  height = frame. 
 size 
 . 
 height 
 ;
         
  _label 
  = [[ 
 UILabel 
  alloc 
 ] 
 initWithFrame 
 : 
 CGRectMake 
 ( 
 0 
 , 
  0 
 , width/ 
 3 
 - 
 20 
 , height)];
       
  //  _label.backgroundColor = [UIColor greenColor]; 
 
         
  _textField 
  = [[ 
 UITextField 
  alloc 
 ] 
 initWithFrame 
 : 
 CGRectMake 
 (width/ 
 3 
 , 
  0 
 , width/ 
 3 
 * 
 2 
 , height)];
         
  _textField 
 . 
 backgroundColor 
  = [ 
 UIColor 
  grayColor 
 ];
         
  // 
  将 
 Label textfield 
  添加到自己身上 
 
         [ 
 self 
  addSubview 
 : 
 _label 
 ];
         [ 
 self 
  addSubview 
 : 
 _textField 
 ];
         [ 
 _label 
  release 
 ]; 
_textField 
  release 
 ];
 
    
 }
 
    
  return 
  self 
 ;
 
}
 
二、 屏幕旋转
 
// 
  布局子视图 
   
  重写父类的方法 
 
 
 // 
  如果已经更改了 
 frame 
  就会触发 
   
  一转就改变了 
 frame 
 ,就触发了该方法 
  那么我就可以在这里更改布局。 
 
 - ( 
 void 
 )layoutSubviews
 {
     [ 
 super 
  layoutSubviews 
 ];
     
  // 
  判断了方向 
   
  就可以更改布局了 
 
     
  //[UIApplication sharedApplication] 
  代表应用程序 
 
     
  // statusBarOrientation 
  代表设备的方向 
 
     
  // UIInterfaceOrientationPortrait   
  正着的方向 
 
     
  // UIInterfaceOrientationPortraitUpsideDown  
  倒着的方向 
 
     
  if 
  ([ 
 UIApplication 
  sharedApplication 
 ]. 
 statusBarOrientation 
  == 
  UIInterfaceOrientationPortrait 
  || [ 
 UIApplication 
  sharedApplication 
 ]. 
 statusBarOrientation 
  == 
  UIInterfaceOrientationPortraitUpsideDown 
 ) {
         
  NSLog 
 ( 
 @" 
 竖屏 
 " 
 );
         
  self 
 . 
 passwordView 
 . 
 frame 
  = 
  CGRectMake 
 ( 
 self 
 . 
 userNameView 
 . 
 frame 
 . 
 origin 
 . 
 x 
 , 
  self 
 . 
 userNameView 
 . 
 frame 
 . 
 origin 
 . 
 y 
  + 
  40 
  + 
  20 
 , 
  300 
 , 
  40 
 );
        
     } 
  else 
  {
         
  NSLog 
 ( 
 @" 
 横屏 
 " 
 );
         
  // 
  重新对横屏 
  进行布局 
   
  首先应该知道它原来是怎么写的 
 
         
  self 
 . 
 passwordView 
 . 
 frame 
  = 
  CGRectMake 
 ( 
 self 
 . 
 userNameView 
 . 
 frame 
 . 
 origin 
 . 
 x 
  + 
  300 
  + 
  20 
 , 
  100 
 , 
  300 
 , 
  40 
 ); 
     
 }
 
}
 
/**
  *  
  屏幕旋转的步骤 
 
     1. 
  允许旋转 
 
     2. 
  允许各个方向 
 
     3. 
  获取横屏还是竖屏 
 
  */ 
 
 
 // 
  是否允许旋转允许旋转 
 
 - ( 
 BOOL 
 )shouldAutorotate    // 旋转 rotate
 {
     
  return 
  YES 
 ;
 }
 - ( 
 NSUInteger 
 )supportedInterfaceOrientations
 {
     
  return 
  UIInterfaceOrientationMaskAll 
 ;
 }
 
 // 
  判断是否是横屏 
 
 
 //  
  划了横线 
   2.0-8.0 
  可以用,禁用 
  或者不推荐用 
 
 
 //- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
 
 
 //{ 
 
 
 //    
  
 
 //} 
 
 
 // 
  官方推荐我们 
 8.0 
 之后用这个方法 
 
 - ( 
 void 
 )viewWillTransitionToSize:( 
 CGSize 
 )size withTransitionCoordinator:( 
 id 
 < 
 UIViewControllerTransitionCoordinator 
 >)coordinator
 {
    
    
     
  // 
  将 
 size 
 转化成字符串打印出来 
 
     
  NSLog 
 ( 
 @"%@" 
 , 
  NSStringFromCGSize 
 (size));
     
  /*
      2015-08-25 17:45:37.979 LessonLTView[4161:214251] {667, 375}
      2015-08-25 17:45:40.618 LessonLTView[4161:214251] {375, 667}
      2015-08-25 17:45:42.686 LessonLTView[4161:214251] {667, 375}
      2015-08-25 17:45:44.203 LessonLTView[4161:214251] {375, 667}
      */ 
}


三、UIViewControl



 *  视图控制器


    自带了一个View (跟屏幕等大) 自带View的属性


·  加载视图   加载的就是 self.view


·  重写父类的方法


- ( 
 void 
 )loadView
 {
     
  // 
  如果使用以下的 
 2 
  选择的话就注释掉这句。就不会崩溃 
   
  不然就崩溃 
   
  因为没调用父类的方法(方法本身就是加载 
 view 
 的),相当于给一个空的东西赋值。所以一般采用 
 1 
  选择,直接进行赋值。 
 
   
 //   [super loadView]; 
 

     
  // 
  它要一个 
 view 
  咱就给它一个 
 
     
  LTBView 
  *login = [[ 
 LTBView 
  alloc 
 ] 
 initWithFrame 
 :[ 
 UIScreen 
  mainScreen 
 ]. 
 bounds 
 ];
     
  // 
  以下两种选择 
   1. 
  直接赋值给 
 self.view 
 
     
  self 
 . 
 view 
  = login;
     [login 
  release 
 ];
     
  //  2. 
  加到 
 self.view 
  上 
 
   
  //  [self.view addSubview:login]; 
 
     
  /**
      *  
  如果还想在上面添加控件的话 
  最好在《视图加载完毕》( 
 viewDidLoad 
 )的方法中添加。 
 
      */ 
}
 
·  
 视图加载完毕
 
- ( 
 void 
 )viewDidLoad {
 
     
 self.view.backgroundColor  = [UIColor  redColor];
 
    
  // 
  视图加载完毕了 
  self.view 
 
    
  // [super viewDidLoad]; 
 
     
  /**
      *  
  把 
  登陆的 
 View 
  取出来 
 
      */ 
 
     
  LTBView 
  *loginView = ( 
 LTBView 
  *) 
 self 
 . 
 view 
 ;
     [loginView. 
 loginButton 
  addTarget 
 : 
 self 
  action 
 : 
 @selector 
 (actionLoginButtton:) 
  forControlEvents 
 :( 
 UIControlEventTouchUpInside 
 )]; 
passwordView.textField.delegate  =  self;
 
}
 
- ( 
 void 
 )viewWillAppear:( 
 BOOL 
 )animated
 {
     
  NSLog 
 ( 
 @" 
 将要显示 
 " 
 );
 }
 - ( 
 void 
 )viewWillDisappear:( 
 BOOL 
 )animated
 {
     
  NSLog 
 ( 
 @" 
 将要消失 
 " 
 );

 }
 - ( 
 void 
 )viewDidAppear:( 
 BOOL 
 )animated
 {
     
  NSLog 
 ( 
 @" 
 已经显示 
 " 
 );

 }
 - ( 
 void 
 )viewDidDisappear:( 
 BOOL 
 )animated
 {
     
  NSLog 
 ( 
 @" 
 已经消失 
 " 
 ); 
·  
 内存警告时触发的。
 
- ( 
 void 
 )didReceiveMemoryWarning {
     
  // 
  把视图销毁。 
 
    
  // self.view = nil; 
 
     
  if 
  ([ 
 self 
  isViewLoaded 
 ] == 
  YES 
  && 
  self 
 . 
 view 
 . 
 window 
  == 
  nil 
 ) {   
  // 
  如果视图已经被加载过且视图不是当前在显示的 
  那么我们才能把视图销毁 
 
         
  // 
  把不用的视图销毁了 
 
         
  self 
 . 
 view 
  = 
  nil 
 ; 
    }
 
}
 
·用UIViewControl 实现页面之间的跳转
 
- ( 
 void 
 )viewDidLoad {
     
  self 
 . 
 view 
 . 
 backgroundColor 
  = [ 
 UIColor 
  yellowColor 
 ];
     
  UIButton 
  *button1 = [ 
 UIButton 
  buttonWithType 
 :( 
 UIButtonTypeCustom 
 )];
     [button1 
  setTitle 
 : 
 @" 
 返回 
 " 
  forState 
 :( 
 UIControlStateNormal 
 )];
     [button1 
  setTitle 
 : 
 @" 
 返回 
 " 
  forState 
 :( 
 UIControlStateHighlighted 
 )];
     button1. 
 backgroundColor 
  = [ 
 UIColor 
  redColor 
 ];
     button1. 
 frame 
  = 
  CGRectMake 
 ( 
 20 
 , 
  20 
 , 
  60 
 , 
  40 
 );
     [button1 
  setTitleColor 
 :[ 
 UIColor 
  blueColor 
 ] 
  forState 
 :( 
 UIControlStateNormal 
 )];
     [button1 
  setTitleColor 
 :[ 
 UIColor 
  grayColor 
 ] 
  forState 
 :( 
 UIControlStateHighlighted 
 )];

     [button1 
  addTarget 
 : 
 self 
  action 
 : 
 @selector 
 (action:) 
  forControlEvents 
 :( 
 UIControlEventTouchUpInside 
 )]; 
self.view  addSubview:button1];
 
    
 [super  viewDidLoad];
 
    
  // Do any additional setup after loading the view. 
 
 }

 - ( 
 void 
 )didReceiveMemoryWarning {
     [ 
 super 
  didReceiveMemoryWarning 
 ];
     
  // Dispose of any resources that can be recreated. 
 
 }
 - ( 
 void 
 )action:( 
 UIButton 
  *)button
 { 
·返回上一层试图控制器
 
self  dismissViewControllerAnimated:YES  completion:nil];
 
}


<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<----------------------------------------


· 夏炎分享的, 上弹窗。  showsheet


     1.UIACtionsheet   
     2.设计样式  主题  self  取消  确定  第一个按钮  第二个按钮      从下往上0-N    actionsheet。actionsheetstyle  =  (枚举类型的样式)。    actionsheet  showInView self.windows
     3.代理方法  if (buttonIndex == 0){ [self showAlert :@"确定"]} else if () {}   再写一个UIAlertView 方法