美文网首页
iOS_UI_03_视图控制器

iOS_UI_03_视图控制器

作者: 孤城99 | 来源:发表于2016-12-07 22:00 被阅读0次

    视图控制器

    一、自定义视图(label-textField组合视图)
    自定义视图的优点:
        1.通过自己封装的视图,可用于别的项目,大大降低开发成本,提高开发效率
        2.高质量代码的特点:可复用,可移植,精炼等。(高内聚,低耦合)
    自定义LTView使用了一种设计模式:复合设计模式
    封装自定义视图的步骤:
        如果不想被其他人在外界胡乱修改设置,就可以通过延展的方式在的.m文件中声明和实现视图控件,只需要设置几个传参数的方法就可以了
        1.声明UILabel和UITextField控件
        2.重写LTView的初始化方法,在初始化的时候拿到总体的frame,在对子视图进行布局
           - (instancetype)initWithFrame:(CGRect)frame{
             //如果外界在调用的时候,frame赋值有误操作,例如宽度给了个0或者负数,这个时候我们就无法正常布局,为了更正这种误操作,需要对frame中的宽度和高度进行判断,看值是否在合理的区间内。
            //根据目测宽度最小是240,所以如果外面传进来的宽度小于240,那么就让宽度改为240;
             if (frame.size.width < 240) {
                 frame.size.width = 240;
                }
            //根据目测高度最小是45,所以如果外面传进来高度小于45,那么就让宽度改为45;
             if (frame.size.height < 45) {
                 frame.size.height = 45;
                }
            //当子视图添加的时候,添加到了父视图矩形的外部,显示可以,但是不能进行交互
              self = [super initWithFrame:frame];
             if (self) {
            //进行自定义的初始化的操作
            _leftLable = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, frame.size.width/3, frame.size.height)];
            _rightTF = [[UITextField alloc] initWithFrame:CGRectMake(frame.size.width/3, 0, frame.size.width*2/3, frame.size.height)];
            [self addSubview:_leftLable];
            [self addSubview:_rightTF];
            self.backgroundColor = [UIColor greenColor];
            }
            return self;
            }
        3.设置传参数的方法,并且要在.h文件中声明方法
            - (void)receivePlaceHolder:(NSString*)placeholder{
               self.rightTF.placeholder = placeholder;
            }
            
            //获取Textfield文本中框中的内容
            - (NSString*)textfieldContent{
            return self.rightTF.text;
            }
            
            //为Textfield设置代理
            - (void)addDelegate:(id)delegate{
            self.rightTF.delegate = delegate;
            }
        4.使用的时候直接通过调用方法传递参数
            //给Textfield设置输入提示
            [ltView receivePlaceHolder:@"请输入用户名"];
            
            //
            [ltView addDelegate:self];
    UIAlertView的学习
        在点击事件完成以后显示警示框(弹出框、提示框),
        1.//创建对象。参数为弹出框的标题,内容,代理对象,取消按钮,其他按钮(可以有多个),
        注意:按钮的位置,取消按钮永远是在0 index的位置上
        UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"友情提示" message:@"您已到达洗澡区域,请您尽快脱掉衣服" delegate:self cancelButtonTitle:@"不脱" otherButtonTitles:@"已脱",@"马上脱", nil];
        2.//显示alert
        [alert show];
    
    二、视图控制器
    1.视图控制器是应用程序数据和视图之间的重要桥梁,每个iOS应用程序只显示一个用户界面,显示的内容是由控制器或一组视图控制器协调管理,所以,视图控制器提供了一个基本的框架来构建应用程序
    2.UIViewController是所有视图控制器的父类。
    3.iOS提供了许多内置的视图控制器,以支持标准的用户界面部分,比如:导航控制器(UINavigationController),标签控制器(UITabBarController),表视图控制器(UITableViewController)等。
    4.视图控制器的功能:
        1.控制视图大小变换、布局视图、响应事件。
        2.检测以及处理内存警告。
        3.检测以及处理屏幕旋转。
        4.检测视图的切换
        5.实现模块独立,提高复用性。
    5.视图控制器的使用:--使用哪个视图控制器,就用那个来创建根视图控制器对象
        self.window.rootViewController = [[ViewController alloc] init];
    
    三、视图控制器指定视图
    视图控制器本身自带的View的设置:
        1.加载视图(在该方法中对VC自带的视图进行初始化操作)---对ViewController自带的视图进行加载,也是系统启动的第一个View
        - (void)loadView{
         [super loadView];
        //创建一个我们需要的视图
         LoginView* myView = [[LoginView alloc] initWithFrame:[UIScreen mainScreen].bounds];
        //将自定义创建的View赋值给系统创建的View
        self.view = myView;
        }
        2.视图加载完毕   - (void)viewDidLoad{
            [super viewDidLoad];
            NSLog(@"%s,%d",__FUNCTION__,__LINE__);//打印执行的方法名和执行代码的行数
            VC生命周期里的一个方法,当执行这个方法的时候,说明VC自带的视图已经加载完毕,我们可以对该视图进行操作,一般视图控制器自带的视图都是和屏幕(window)一样大小。一般都是在该方法中初始化我们的UI控件。
        }
    
    四、MVC
    1.UIViewController是MVC设计模式的核心。
    2.MVC是一个框架级的设计模式,M是Model,主要用于建立数据模型(及数据的结构)。V是View,我们能看到的所有控件都是View,View的主要功能是展示数据。C数控制器,主要是控制M和V的通信。
    3.M和C之间通过通知(Natification)和KVO来通信。
    4.V和C之间通过协议代理和target通信
    5.MVC的优点:低耦合性、高重用性和可适用性,系统的可维护性、可扩展性增强,代码量是一样
    
    五、屏幕旋转LandscapeRight
    1.屏幕的方向:Portrait(竖向),UpsideDown(颠倒),LandscapeLeft(左横屏),LandscapeRight(右横屏)
    2.检测屏幕的旋转
       1.supportedInterfaceOrientations(设置设备支持旋转的方向,如果不添加,视图控制器将无法检测屏幕的旋转)。
       2.willRotateToInterfaceOrientation:duration:(暂停音乐、关闭视图交互等)。
       3.willAnimateRotationToInterfaceOrientation:duration:(添加自定义动画等)。
       4.didRotateFromInterfaceorientation:(播放音乐、打开视图交互等)。
    3.视图的处理
       1.注意视图控制器会自动调整View的大小以适应屏幕旋转,bounds被修改,触发View的layoutSubviews方法。
       2.View重写layoutSubviews方法,根据设备方向,重新布局
       3.[UIApplication shareApplication].statusBarOrientation提供设备当前方向
    4.举例
      当屏幕发生旋转或者当前视图的bounds或者frame发生改变的时候,View会执行下面的方法,在该方法中我们对视图上面的子控件进行重新布局
        - (void) layoutSubviews{
            [super layoutSubviews];
            //拿到需要调整位置的控件的frame
            CGRect labelRect = self.userNameLabel.frame;
            //判断屏幕是否横屏
            //[UIApplication sharedApplication]:得到应用程序对象
            UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
            switch (orientation) {
                  case  UIInterfaceOrientationUnknown:
                      NSLog(@"不知道当前屏幕的方向");
                 break;
                  case UIInterfaceOrientationPortrait:
                      NSLog(@"竖屏方向");
                      //设置回初始状态
                      labelRect = CGRectMake(100, 100, 100, 50);
                 break;
                 case UIInterfaceOrientationPortraitUpsideDown:
                       NSLog(@"倒立方向");
                 break;
                 case UIInterfaceOrientationLandscapeLeft:
                       NSLog(@"左横屏方向");
     //            labelRect.origin = CGPointMake(([UIScreen mainScreen].bounds.size.width - CGRectGetWidth(labelRect))/2, (([UIScreen mainScreen].bounds.size.height - CGRectGetHeight(labelRect))/2));
                       self.userNameLabel.center = self.center;
                 break;
                 case UIInterfaceOrientationLandscapeRight:
                       NSLog(@"右横屏方向");
                       labelRect.origin = CGPointMake(([UIScreen mainScreen].bounds.size.width - CGRectGetWidth(labelRect))/2, ([UIScreen mainScreen].bounds.size.height - CGRectGetHeight(labelRect))/2);
                 break;
                 default:
                 break;
                 } 
       self.userNameLabel.frame = labelRect;
    }
    
    六、内存警告
    当我们发生内存问题的时候,系统会自动调用该方法,一般是释放内存不及时
       - (void)didReceiveMemoryWarning {
         [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
        NSLog(@"内存警告了");
        //如果当前视图已经被加载,但是又没有显示。
        if ([self isViewLoaded] && [self.view window] == nil) {
        self.view = nil;
        }
        }
    
    七、懒加载
    懒加载 lazy load :本质上就是重写属性的getter方法,当调用该属性的getter方法的时候。在该方法内部对属性进行初始化操作
    - (UILabel*)userNameLabel{
    //当外部调用该属性的getter方法的时候,我们先判断该对象是否已经给创建过了。如果已经创建,那么,直接返回
    if (!_userNameLabel) {
        //创建控件属性的对象
        _userNameLabel = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 50)];
        //将控件对象添加到View上
        [self addSubview:_userNameLabel];
    }
    return _userNameLabel;
    }

    相关文章

      网友评论

          本文标题:iOS_UI_03_视图控制器

          本文链接:https://www.haomeiwen.com/subject/cjsjmttx.html