UI总结

作者: 爱炸毛的小鸡崽子 | 来源:发表于2018-04-16 15:53 被阅读0次

    一:项目中的常见文件
    1.Tests文件夹:单元测试
    2.Frameworks:依赖的框架
    3.Info.plist: 项目配置文件.程序加载首先加载配置文件.
    3.1 Localiztion native development region(CFBundleDevelopmentRegion) 本地化相关
    3.2 Bundle display name(CFBundleDisplayName) 程序安装后显示的名称,限制在10-12个字符
    3.3 Icon file(CFBundleIconFile) app图标名称,一般为Icon.png
    3.4 Bundle version(CFBundleShortVersionString) 应用程序版本号,每次发布appstore时需要增加这个版本号
    3.5 Main storyboard file base name(NSMainStoryboardFile) 主storyboard文件的名称
    3.6 Bundle identifier(CFBundleIdentifier) 项目唯一标识,部署真机时使用
    4.Info.plist对应xcode的图形界面,改变图形界面,就会改变Info.plist.
    5.pch文件: Supporting files文件夹下"工程名-Prefix.pch"的文件,是一个头文件,能被项目中的其他所有源文件共享和访问.
    5.1 pch文件的作用
    1.放一些全局的宏.
    2.导入一些全局都需要的头文件.
    3.管理日志输出
    日志输出是非常消耗性能的,发版时候不需要日志输出,只有debug才需要.
    5.2 自定义输出,不要使用系统自带的NSLog

    define NQQLog(...) NSLog(VA_ARGS)

    //标识可接受任何参数
    VA_ARGS 标识左边...的参数会替代到右边NSLog中.
    1.如果不想打印了,直接注释后面的 #define NQQLog(...) // NSLog(VA_ARGS)
    2.还可以使用条件编译
    #ifdef DEBUG //调试阶段
    #define NQQLog(...) NSLog(VA__ARGS)
    #else //发版阶段
    #define NQQLog(...)
    #endif

    5.3 在pch写的有关oc代码,最好放在#define OBJC , xcode在每个oc文件中都定义了这个宏,只有oc文件才有这些宏.

    二.UIApplication
    1.UIApplication不能手动创建,一个app只允许有一个.
    每一个app都有自己的UIApplication对象,并且是单例的.
    [UIApplication sharedApplication]可以获得这个单例对象
    一个app启动后创建的第一个对象就是UIApplication对象.
    2.UIApplication的作用: 做应用级别的操作
    2.1 app红色提醒数字
    @property(nonatomic) NSInteger applicationIconBadgeNumber;
    2.2 显示联网状态可见性
    @property(nonatomic,getter=isNetworkActivityIndicatorVisible) BOOL networkActivityIndicatorVisible;
    2.3 打开一个资源

    3.openURL:
    //UIApplication有个功能强大的openURL方法

    • (BOOL)openURL:(NSURL *)url;

    //打电话
    UIApplication *app = [UIApplication sharedApplication];
    [app openURL:[NSURL URLWithString:@"tel://10086"];

    //发短信
    [app openURL:[NSURL URLWithString:@"sms://10086"];

    //发邮件
    [app openURL:[NSURL URLWithString:@"mailto://328477273@qq.com"];

    //打开一个网页资源
    [app openURL:[NSURL URLWithString:@"http://www.jianshu.com"];

    4.UIApplication打开资源的好处:不用判断用什么软件打开的,系统会根据协议头判断.

    5.UIApplication管理状态栏, iOS7后提供了2种管理状态栏的方式
    5.1 通过UIViewController管理(每一个UIViewController都可以拥有自己不同的状态栏).
    5.2 通过UIApplication管理(一个应用程序状态栏都由它同一个管理)
    //如果想利用UIApplication管理状态栏,首先要修改Info.plist


    image.png

    5.3 iOS7,默认下,状态栏都是由UIViewController管理的
    //状态栏样式

    • (UIStatusBarStyle)preferredStatusBarStyle;

    //状态栏的可见性

    • (BOOL)prefersStatusBarHidden;

    三.UIApplication 和 delegate

    1. 所有的移动操作系统都有一个致命的缺点,app容易受到打扰.比如来电或者锁屏会导致app进入后台甚至被终止.

    在app收到干扰时,会产生一些系统事件,此时UIApplication会通知它的delegate对象,让delegate代理对象来处理这些系统事件.

    AppDelegate就是UIApplication的代理.
    AppDelegate默认遵守了UIApplicationDelegate协议.


    image.png
    1. app启动过程:
      2.1 创建application, 创建并设置application的代理.
      2.2 开启事件循环,不断监听事件.如果产生系统事件,就会通知代理,其他事件,会找到一个合适的视图处理事件.
      2.3 只有应用程序关闭,才会结束程序.

    UIApplicationMain函数会开启一个事件循环,并不会马上就执行完毕.
    底层机制:
    创建UIApplication对象和UIApplicationDelegate对象,设置UIApplication的代理,开启事件循环,监听系统事件.

    2.4 delegateClassName不能传nil,意味着application没有代理,就无法监听系统的事件,系统的事件都没法监听,窗口都不知道什么时候去加载, 由于视图都是懒加载的,因此就不会创建窗口,什么也没有.
    2.5 principalClassName传nil,默认是UIApplication,创建一个UIApplication对象.

    2.6 UIApplication代理的作用: 处理系统事件,不是任何事件都交给它处理, 按钮点击,屏幕点击都不是它处理, 是由UIApplication处理.
    2.6.1 加载完成,初始化操作
    2.6.2 进入后台: 一般在这里保存应用的数据(游戏数据,暂停游戏)
    2.6.3 内存警告: 清空不必要的内容.

    四.UIWindow
    一种特殊的UIView,通常一个app中至少会有一个UIWindow.
    app启动后,创建的第一个视图控件就是UIWindow,接着创建控制器的View,最后将控制器的View添加到UIWindow上.没有UIWindow就看不见任何东西.

    1.添加UIView到UIWindow
    //直接将view添加到UIWindow中,但并不会理会view对应的UIViewController

    • (void)addSubView:(UIView *)view;

    //自动将rootViewController的view添加到UIWindow中,管理rootViewController的生命周期.
    @propery(nonatomic,retain) UIViewController *rootViewController;

    //让当前UIWindow变成keyWindow

    • (void)makeKeyWindow;

    //让当前UIWindow变成keyWindow,并显示出来
    -(void)makeKeyAndVisible;

    1. UIWindow的获得
      2.1 [UIApplication sharedApplication].windows
    //用来接收键盘一集非触摸类的消息事件的UIWindow,而且程序中每个时刻只能有一个UIWindow是keyWindow.如果某个UIWindow内部的文本框不能输入文字,可能是因为这个UIWindow不是keyWindow.
    2.2 [UIApplication sharedApplication].keyWindow
    
    //获得某个UIView所在的UIWindow
    view.window
    
    image.png

    关于UIWindow的一些补充:
    window层级: UIWindowLevelNormal < UIWindowLevelStatusBar < UIWindowLevelAlert
    UIWindowLevelNormal : 默认窗口的层级.
    UIWindowLevelStatusBar : 状态栏,键盘.
    UIWindowLevelAlert : UIActionSheet,UIAlertView
    把window的层级设置为UIWindowLevelAlert,就会显示在最前面.

    五.控制器的创建
    1.怎么自己通过storyboard创建控制器(空项目),之前都是系统加载 storyboard,帮我们创建好控制器。
    • 了解UIStoryboard对象,通过这个对象,就能加载storyboard文件 注意:必须要有storyboard,创建UIStoryboard对象才有意义,alloc init创 建UIStoryboard对象没有意义
    1.1> instantiateInitialViewController:默认加载箭头指向的控制器
    1.2> instantiateViewControllerWithIdentifier:根据标识在storyboard查找 控制器,并且创建。
    ○ 标识不能乱传,会报错的,必须storyboard有这个标识才行。
    1.3> 现在创建的控制器都不能处理事件,如果需要处理事件,需要自定 义控制器。
    • 现在创建的控制器为什么不能处理事件?
    • 原因:当通过storyboardID找到storyboard中的控制器的时候,就会
    创建storyboard中描述的控制器对象,创建对象首先得知道类名, 会根据storyboard中的Custom Class确定类名,然后创建对象,默认 都是系统自带的对控制器对象,系统自带的是不能处理事件的。他 不能写监听方法。

    记住:要想处理控制器事件,必须自定义控制器。
    2.模仿系统怎么通过main.storyboard加载程序的。(带storyboard的项目) 1> 带有storyboard的程序,默认程序一启动,就会加载storyboard,自动 创建好窗口和根控制器。
    2> 系统怎么判断需不需加载storyboard?主要看有没有设置主界面,如果 设置了Main,就会去加载Main.storyboard.

    3> 在新增一个storyboard文件,怎么加载新增的storyboard,修改主界 面。
    4> 模仿程序一启动就加载Main.storyboard文件,创建窗口,创建箭头指
    向的窗口根控制器,并且显示窗口。
    • 先清空主界面设置,需要删除缓存。
    3> storyboard storyboard
    面。
    4> 模仿程序一启动就加载Main.storyboard文件,创建窗口,创建箭头指
    向的窗口根控制器,并且显示窗口。
    • 先清空主界面设置,需要删除缓存。

    image.png
    1. 通过xib创建控制器的view(空项目) • 首先得要有xib。
      3.1 xib注意点:(演示没有的后果)
      1> xib里面必须有一个view描述控制器的view,因为控制器的view 属性必须有值。
      2> xib需要指定描述哪一个控制器,描述UIView不需要,因为xib里 面可以描述很多UIView,不能固定死,但是控制器就不一样了,一个 xib就用来描述一个控制器。
      3> xib里面可能有很多view,需要拖线指明哪个是控制器的view
      3.2 xib和storyboard的区别 storyboard已经指定了控制器的view,不需要我们管,xib需要我们 手动管理。

    六.控制器view的创建
    1.控制器view的加载,首先要自定义控制器view,作为根控制器.
    2.直接通过alloc init创建的控制器的view默认就是透明的.
    3.重写控制器的loadView,不会去加载storyboard.
    4.解释loadView方法
    4.1 loadView作用: 用来创建自定义view
    4.2 loadView调用时机: 当控制器view没有创建时,就会调用loadView创建控制器的view.
    4.3 loadView使用注意: 如果重写loadView里面没有创建控制器的view,就不能使用self.view, 会造成死循环.


    image.png

    5.通过xib加载控制器的view
    NQQViewControllerAAA的xib描述控制器的view,通过这个xib加载控制器的view
    NQQViewController的xib描述控制器的view,不用告诉控制器去加载哪个xib,会自动去加载NQQViewController这个xib.
    NQQView的xib描述控制器的view,通过这个xib加载控制器的view,不用告诉控制器去加载哪个xib,优先去加载NQQView这个xib

    6.控制器View的优先级:
    重写loadView > storyboard > nibName > xib

    7.控制器的view是延迟加载的

    相关文章

      网友评论

        本文标题:UI总结

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