iOS基础知识总结(1)

作者: 我想走走 | 来源:发表于2018-06-07 17:35 被阅读10次

    第一天

    从iOS9开始的常见报错

    Application windows are expected to have a root view controller at the end of application launch
    
    • 从iOS9开始, 在程序启动完毕那一刻显示出来的窗口必须要设置根控制器

    应用程序的图标

    • 旧项目中的图标只要符合1个条件即可
      • 图片名叫做Icon.png

    有些图片显示出来会自动渲染成蓝色

    比如

    • 设置tabBarItem的选中图片
    vc.tabBarItem.selectedImage = image;
    
    • 设置UIButtonTypeSystem样式按钮的image时
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem];
    [btn setImage:image forState:UIControlStateNormal];
    

    解决方案

    • 再次产生一张不会进行渲染的图片
    // 加载图片
    UIImage *tempImage = [UIImage imageNamed:@"tabBar_essence_click_icon"];
    // 产生一张不会进行自动渲染的图片
    UIImage *selectedImage = [tempImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    vc.tabBarItem.selectedImage = selectedImage;
    
    • 直接在xcassets文件中配置


      Snip20151105_1.png

    设置TabBarItem的文字属性

    • 直接设置每一个tabBarItem对象
    // 普通状态下的文字属性
    NSMutableDictionary *normalAttrs = [NSMutableDictionary dictionary];
    normalAttrs[NSFontAttributeName] = [UIFont systemFontOfSize:14];
    normalAttrs[NSForegroundColorAttributeName] = [UIColor grayColor];
    [vc.tabBarItem setTitleTextAttributes:normalAttrs forState:UIControlStateNormal];
    
    // 选中状态下的文字属性
    NSMutableDictionary *selectedAttrs = [NSMutableDictionary dictionary];
    selectedAttrs[NSForegroundColorAttributeName] = [UIColor darkGrayColor];
    [vc.tabBarItem setTitleTextAttributes:selectedAttrs forState:UIControlStateSelected];
    
    // 字典中用到的key
    1.iOS7之前(在UIStringDrawing.h中可以找到)
    - 比如UITextAttributeFont\UITextAttributeTextColor
    - 规律:UITextAttributeXXX
    
    2.iOS7开始(在NSAttributedString.h中可以找到)
    - 比如NSFontAttributeName\NSForegroundColorAttributeName
    - 规律:NSXXXAttributeName
    
    • 通过UITabBarItem的appearance对象统一设置
    /**** 设置所有UITabBarItem的文字属性 ****/
    UITabBarItem *item = [UITabBarItem appearance];
    // 普通状态下的文字属性
    NSMutableDictionary *normalAttrs = [NSMutableDictionary dictionary];
    normalAttrs[NSFontAttributeName] = [UIFont systemFontOfSize:14];
    normalAttrs[NSForegroundColorAttributeName] = [UIColor grayColor];
    [item setTitleTextAttributes:normalAttrs forState:UIControlStateNormal];
    // 选中状态下的文字属性
    NSMutableDictionary *selectedAttrs = [NSMutableDictionary dictionary];
    selectedAttrs[NSForegroundColorAttributeName] = [UIColor darkGrayColor];
    [item setTitleTextAttributes:normalAttrs forState:UIControlStateSelected];
    

    项目的图片资源

    颜色相关的一些知识

    • 颜色的基本组成
      • 一种颜色由N个颜色通道组成
    • 颜色通道
      • 1个颜色通道占据8bit
      • 1个颜色通道的取值范围
        • 10进制 : [0, 255]
        • 16进制 : [00, ff];
      • 常见的颜色通道
        • 红色 red R
        • 绿色 green G
        • 蓝色 blue B
        • 透明度 alpha A
      • R\G\B一样的是灰色
    • 颜色的种类
      • 24bit颜色
        • 由R\G\B组成的颜色
        • 常见的表示形式
          • 10进制(仅仅是用在CSS)
            • 红色 : rgb(255,0,0)
            • 绿色 : rgb(0,255,0)
            • 蓝色 : rgb(0,0,255)
            • 黄色 : rgb(255,255,0)
            • 黑色 : rgb(0,0,0)
            • 白色 : rgb(255,255,255)
            • 灰色 : rgb(80,80,80)
          • 16进制(可以用在CSS\android)
            • 红色 : #ff0000 #f00
            • 绿色 : #00ff00 #0f0
            • 蓝色 : #0000ff #00f
            • 黄色 : #ffff00 #ff0
            • 黑色 : #000000 #000
            • 白色 : #ffffff #fff
            • 灰色 : #979797
      • 32bit颜色
        • 由R\G\B\A组成的颜色
        • 常见的表示形式
          • 10进制(仅仅是用在CSS)
            • 红色 : rgba(255,0,0,255)
            • 绿色 : rgba(0,255,0,255)
            • 蓝色 : rgba(0,0,255,255)
            • 黄色 : rgba(255,255,0,255)
            • 黑色 : rgba(0,0,0,255)
            • 白色 : rgba(255,255,255,255)
          • 16进制(#AARRGGBB, 仅仅是用在android)
            • 红色 : #ffff0000
            • 绿色 : #ff00ff00
            • 蓝色 : #ff0000ff
            • 黄色 : #ffffff00
            • 黑色 : #ff000000
            • 白色 : #ffffffff

    PCH文件可能引发的错误

    Snip20151105_8.png
    • 解决方案
    #ifndef PrefixHeader_pch
    #define PrefixHeader_pch
    
    /*** 如果希望某些内容能拷贝到任何源代码文件(OC\C\C++等), 那么就不要写在#ifdef __OBJC__和#endif之间 ***/
    
    
    /***** 在#ifdef __OBJC__和#endif之间的内容, 只会拷贝到OC源代码文件中, 不会拷贝到其他语言的源代码文件中 *****/
    #ifdef __OBJC__
    
    
    #endif
    /***** 在#ifdef __OBJC__和#endif之间的内容, 只会拷贝到OC源代码文件中, 不会拷贝到其他语言的源代码文件中 *****/
    
    
    #endif
    

    在Build Setting中配置宏

    • 如果项目中有些宏找不到, 可能是配置在Build Setting中


      Snip20151105_9.png
    • 注意点:宏的名字不能全部是小写字母

    • 如果宏的名字全部是小写, 会出现以下错误


      Snip20151105_10.png

    第二天

    控制台可能会输出以下警告信息

    • 警告的原因: [UIImage imageNamed:nil]
    CUICatalog: Invalid asset name supplied: (null)
    CUICatalog: Invalid asset name supplied: (null)
    
    • 警告的原因: [UIImage imageNamed:@""]
    CUICatalog: Invalid asset name supplied:
    CUICatalog: Invalid asset name supplied:
    

    准确判断一个字符串是否有内容

    if (string.length) {
    
    }
    
    /*
    错误写法:
    if (string) {
    
    }
    */
    

    替换UITabBarController内部的tabBar

    // 这里的self是UITabBarController
    [self setValue:[[XMGTabBar alloc] init] forKeyPath:@"tabBar"];
    

    center和size的设置顺序

    • 建议的设置顺序
      • 先设置size
      • 再设置center

    给系统自带的类增加分类

    • 建议增加的分类属性名\方法名前面加上前缀, 比如
    @interface UIView (XMGExtension)
    @property (nonatomic, assign) CGFloat xmg_width;
    @property (nonatomic, assign) CGFloat xmg_height;
    @property (nonatomic, assign) CGFloat xmg_x;
    @property (nonatomic, assign) CGFloat xmg_y;
    @property (nonatomic, assign) CGFloat xmg_centerX;
    @property (nonatomic, assign) CGFloat xmg_centerY;
    
    @property (nonatomic, assign) CGFloat xmg_right;
    @property (nonatomic, assign) CGFloat xmg_bottom;
    @end
    

    按钮常见的访问方法

    [button imageForState:UIControlStateNormal].size;
    button.currentImage.size;
    
    [button backgroundImageForState:UIControlStateNormal];
    button.currentBackgroundImage;
    
    [button titleForState:UIControlStateNormal];
    button.currentTitle;
    
    [button titleColorForState:UIControlStateNormal];
    button.currentTitleColor;
    

    设置按钮的内边距

    @property(nonatomic) UIEdgeInsets contentEdgeInsets UI_APPEARANCE_SELECTOR;
    @property(nonatomic) UIEdgeInsets titleEdgeInsets;
    @property(nonatomic) UIEdgeInsets imageEdgeInsets;
    

    解决导航控制器pop手势失效

    self.interactivePopGestureRecognizer.delegate = self;
    
    - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
    {
        // 手势何时有效 : 当导航控制器的子控制器个数 > 1就有效
        return self.childViewControllers.count > 1;
    }
    

    第三天

    frame和bounds的重新认识

    • frame
      • 父控件 内容的左上角为坐标原点, 计算出的控件自己 矩形框的位置和尺寸
    • bounds
      • 控件自己 内容的左上角为坐标原点, 计算出的控件自己 矩形框的位置和尺寸
    • 概括
      • frame.size == bounds.size
      • scrollView.bounds.origin == scrollView.contentOffset

    bounds和frame的区别

    bounds和frame的区别.png

    矩形框和内容的理解

    • 矩形框
      • 控件自己的显示位置和尺寸
    • 内容
      • 控件内部的东西,比如它的子控件

    在使用UITableViewController过程中,可能会出现的错误

    @interface TestTableViewController : UITableViewController
    
    @end
    
    '-[UITableViewController loadView] instantiated view controller with identifier "UIViewController-BYZ-38-t0r" from storyboard "Main", but didn't get a UITableView.'
    
    • 造成这个错误的原因
      • 错误地将一个UIViewController当做UITableViewController来用
    • 错误做法
    Snip20151108_134.png
    • 正确做法
    Snip20151108_135.png Snip20151108_137.png

    contentInset的调整

    • 默认情况下, 如果一个控制器A处在导航控制器管理中, 并且控制器A的第一个子控件是UIScrollView, 那么就会自动调整这个UIScrollView的contentInset
      • UIEdgeInsetsMake(64, 0, 0, 0) // 有导航栏
      • UIEdgeInsetsMake(20, 0, 0, 0) // 没有导航栏
    • 默认情况下, 如果一个控制器A处在导航控制器管理中, 并且导航控制器又处在UITabBarController管理中, 并且控制器A的第一个子控件是UIScrollView, 那么就会自动调整这个UIScrollView的contentInset
      • UIEdgeInsetsMake(64, 0, 49, 0)
    • 如何禁止上述的默认问题?
    控制器A.automaticallyAdjustsScrollViewInsets = NO;
    

    文字内容换行

    • 如何让storyboard\xib中的文字内容换行
      • 快捷键: option + 回车键
      • 在storyboard\xib输入\n是无法实现换行的
    • 在代码中输入\n是可以实现换行的
    self.label.text = @"534534534\n5345345\n5345";
    

    修改状态栏样式

    • 使用UIApplication来管理


      Snip20151108_152.png
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
    

    在Info.plist中做了图中的配置,可能会出现以下警告信息


    Snip20151108_153.png
    • 使用UIViewController来管理
    @implementation XMGLoginRegisterViewController
    - (UIStatusBarStyle)preferredStatusBarStyle
    {
        return UIStatusBarStyleLightContent;
    }
    @end
    

    在xib\storyboard中使用KVC

    Snip20151108_177.png

    bounds和frame区别

    bounds和frame的区别.png

    相关文章

      网友评论

        本文标题:iOS基础知识总结(1)

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