zoukankan      html  css  js  c++  java
  • ##DAY3 自定义视图、视图控制器、视图控制器指定视图、loadView、 viewDidLoad、MVC、屏幕旋转、内存警告

    ##DAY3 自定义视图、视图控制器、视图控制器指定视图、loadView、 viewDidLoad、MVC、屏幕旋转、内存警告

    #pragma mark ———————自定义视图的步骤 ———————————

    自定义视图的步骤:

    1)明确该视图内部有什么控件,并且将所有控件声明成属性

    2)重写LTView继承UIView的布局方法(initWithFrame:),来创建子视图,并且添加子视图(定义label和textField的布局frame,并将其添加到LTView中)(注意开辟空间,一定要将子视图加入到父视图上)(这里是 self = [super initWithFrame:frame];)

    3)自定义初始化方法(定义label和textField的基本属性)(这里是 self = [self initWithFrame:frame];)

    4)内存管理(label和textField在第二步创建时alloc增加的引用计数,或是使用setter方法增加的引用计数)

    #pragma mark ———————视图控制器 ———————————

    视图控制器:

    视图控制器概述:

    1)视图控制器是应用程序数据和视图之间的重要桥梁,每个iOS应⽤程序只显示一个用户界面,显示的内容是由控制器或一组视图控制器协调管理。所以,视图控制器提供了一个基本的框架来构建应用程序。

    2)UIViewController是所有视图控制器的父类。

    3)iOS提供了许多内置的视图控制器,以支持标准的用户界面部分,比如导航控制器(UINavigationController), 标签控制器(UITabBarController), 表视图控制器(UITableViewController)等。

    视图控制器的功能:

    1)控制视图大小变换、布局视图、响应事件.

    2)检测以及处理内存警告。

    3)检测以及处理屏幕旋转。

    4)检测视图的切换。

    5)实现模块独立性,提高复用性

    设置window的根视图控制器:

    第一步:引入视图控制器的头文件

    第二步:在application:didFinishLaunchingWithOptions:方法中定义window的根视图

    视图控制器的使⽤:

    第一步:定义UIViewController的子类(创建视图控制器类MyUIViewController)

    第二步:在APPDelegate里创建视图控制器对象(myViewController),作为window的根视图控制器(指定window的根视图控制器self.window.rootView = myViewController;)

    第三步:在视图控制器类(MyUIViewController)的viewDidLoad方法中,使用默认创建好的视图对象(self.view)(在viewDidLoad方法内部创建视图,并且添加到根视图(self.view)上面)

    注意:无法改变视图控制器上默认视图(self.view)的布局(frame)

    视图控制器的默认视图用 init 初始化即可:

    UIView *view = [[UIView alloc] init];

    view.backgroundColor = [UIColor redColor];

    self.view = view;

    #pragma mark ———————视图控制器指定视图 ———————————

    视图控制器指定视图:

    1)自定义视图类继承UIViw。在初始化方法中添加子视图控件。

    2)重写controller的loadView⽅法。创建自定义视图对象(alloc),并指定为 controller的view。(注:loadView方法在控制器的view为nil的时候被调用,用于以编程的方式创建view。loadView是使用代码生成视图的时候,当视图第一次载入的时候调用的⽅法,用于使用(写)代码来实现控件。)

    3)将子视图控件对象设置为自定义视图类的属性,在viewDidLoad方法中进行设置:添加action、设置delegate等等。

    4)在controller中添加按钮点击事件实现和代理⽅法的实现。

    #pragma mark ———————loadView、 viewDidLoad———————————

    loadView 方法的注意事项:

    1)loadView在每一次使用self.view这个property,并且self.view为nil的时候被调用,用以产生一个有效的self.view(手工维护views,必须重写该方法)

    2)view 控制器收到didReceiveMemoryWarning的消息时, 默认的实现是检查当前控制器的view是否在使用。 如果它的view不在当前正在使用的view hierarchy里面,且你的控制器实现了loadView方法,那么这个view将被release, loadView方法将被再次调用来创建一个新的view。(注:iOS6.0以下 如果没有实现loadView,内存警告时不会调用viewDidUnload)

    重写loadView 方法的注意事项:

    1)加载根视图的方法,我们通常在这个方法中,指定根视图为我们想要的某个视图

    2)并且在一个视图器生命周期中,这个方法只会走一次

    3)在加载方法中不能使用self.view这个getter方法获取根视图,因为此时根视图正在加载,并没有真实存在

    viewDidLoad方法的注意事项:

    1)视图控制器加载完毕的方法,默认视图控制器是空白师徒,并且背景色是透明色clearColor

    2)如果想要显示内容,只需在此方法内部创建视图,并且添加到根视图(sefl.view)上面

    3)一般我们会在这里做界面上的初始化操作,比如往view中添加一些子视图、从数据库或者网络加载模型数据到子视图中

    #pragma mark ———————MVC———————————

    MVC概述:

    1)UIViewController是MVC设计模式的核心。

    2)MVC是一个框架级的设计模式。

    3)M是Model,主要用建⽴数据模型(即数据的结构)。

    4)V是View,我们能看到的所有控件都是view,view主要的功能是展示数据。

    5)C是控制器,主要是控制M和V的通信。

    #pragma mark ———————屏幕旋转———————————

    屏幕旋转:

    检测屏幕旋转:

    视图控制器本身能检测到屏幕的旋转,如果要处理屏幕旋转,需要重写几个方法:

    1)supportedInterfaceOrientations(设置设备支持旋转的方向,如果不添加,视图控制器将无法检测屏幕的旋转)。

    2)willRotateToInterfaceOrientation:duration:(旋转的时候,暂停音乐、关闭视图交互等)。

    3)willAnimateRotationToInterfaceOrientation:duration:(添加自定义动画等)。

    4)didRotateFromInterfaceOrientation:(播放音乐、打开视图交互等)。

    视图控制器的其他重要方法:

    1)视图控制器里的视图的大小发生改变的时候,视图控制器会收到这个方法的通知(即这个方法会在此时自动执行):

    viewWillTransitionToSize:withTransitionCoordinator:

    2)设置屏幕旋转时支持的方法,返回所有视图控制器支持的方向(注意home键在上的情况默认不处理):

    supportedInterfaceOrientations

    /*

     注意:在这个方法的API中可找到以下枚举值,这里不详细介绍

     //UIInterfaceOrientationMaskAll 横屏和竖屏

     //UIInterfaceOrientationMaskLandscape 横屏

     */

    视图的处理:

    1)注意视图控制器会自动调整view的大小以适应屏幕旋转,bounds被修改, 触发view的layoutSubviews方法。

    2)view重写layoutSubviews方法,根据设备方向,重新布局。

    3)[UIApplication shareApplication].statusBarOrientation提供设备当前方向(获取应用程序的状态栏的方向)。

    //只要视图本身的bounds发生变化,此方法就会执行

    - (void)layoutSubviews {

        //获取屏幕方向 UIInterfaceOrientation(枚举类型)

        UIInterfaceOrientation orientaion = [UIApplication sharedApplication].statusBarOrientation;

        //判断是否横向

        if (orientaion == UIInterfaceOrientationLandscapeLeft || orientaion == UIInterfaceOrientationLandscapeRight) {

            self.getbackButton.frame = CGRectMake(300, 150, 100, 40);

        }else {

            self.getbackButton.frame = CGRectMake(150, 150, 100, 40);

        }

    }

    #pragma mark ———————内存警告———————————

    内存警告:

    ios下每个app可用的内存是被限制的,如果一个app使用的内存超过了这个阀值,则系统会向该app发送Memory Warning消息。收到消息后,app必须尽可能多的释放一些不必要的内存,否则OS会关闭app。

    注意:

    1)多用lazyCode(懒加载)

    2)viewDidLoad由于在初次创建viewcontroller和重新恢复时都会调用,因此这个函数需要注意区分不同的情况,设置正确的状态。

    http://blog.sina.com.cn/s/blog_65c178a80101gb66.html

  • 相关阅读:
    在vue中引入layer弹框的简易方法
    in ./node_modules/qs/lib/index.js Module build failed: Error: ENOENT: no such file or directory, o
    vue路由传参的三种基本方式
    跳转路由时传参,elementUI的table表格点击对应行,获取对应行的数据;更改el-table头部样式
    用Vue写移动端时有哪些UI框架
    1月25日学习日志
    1月22日学习日志
    1月21日学习日志
    1月20日学习日志
    1月19日学习日志
  • 原文地址:https://www.cnblogs.com/chongyu/p/5192422.html
Copyright © 2011-2022 走看看