iOS_UI_03_视图控制器

视图控制器

一、自定义视图(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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容