一、屏幕适配
1.程序启动会自动加载叫做Default的图片
1> 3.5inch 非retain屏幕:Default.png
2> 3.5inch retina屏幕:Default@2x.png
3> 4.0inch retain屏幕: Default-568h@2x.png
2> 3.5inch retina屏幕:Default@2x.png
3> 4.0inch retain屏幕: Default-568h@2x.png
2.只有程序启动时自动去加载的图片, 才会自动在4inch retina时查找-568h@2x.png
二、一个控件用肉眼看不见,有哪些可能
1.根本没有创建实例化这个控件
2.没有设置尺寸
3.控件的颜色跟父控件的背景色一样(实际上已经显示了,只不过用肉眼看不见)
4.透明度alpha <= 0.01
5.hidden = YES
6.没有添加到父控件中
7.被其他控件挡住了
8.位置不对
9.父控件发生了以上情况
10.特殊情况
* UIImageView没有设置image属性,或者设置的图片名不对
* UILabel没有设置文字,或者文字颜色和跟父控件的背景色一样
* UITextField没有设置文字,或者没有设置边框样式borderStyle
* UIPageControl没有设置总页数,不会显示小圆点
* UIButton内部imageView和titleLabel的frame被篡改了,或者imageView和titleLabel没有内容
* .....
2.没有设置尺寸
3.控件的颜色跟父控件的背景色一样(实际上已经显示了,只不过用肉眼看不见)
4.透明度alpha <= 0.01
5.hidden = YES
6.没有添加到父控件中
7.被其他控件挡住了
8.位置不对
9.父控件发生了以上情况
10.特殊情况
* UIImageView没有设置image属性,或者设置的图片名不对
* UILabel没有设置文字,或者文字颜色和跟父控件的背景色一样
* UITextField没有设置文字,或者没有设置边框样式borderStyle
* UIPageControl没有设置总页数,不会显示小圆点
* UIButton内部imageView和titleLabel的frame被篡改了,或者imageView和titleLabel没有内容
* .....
解决办法:添加一个控件的建议(调试技巧):
1.最好设置背景色和尺寸
2.控件的颜色尽量不要跟父控件的背景色一样
三、 更换系统自带的tabbar
1.如果tabBar设置完delegate后,再执行下面代码修改delegate,就会报错
tabBar.delegate = self;
2.如果再次修改tabBar的delegate属性,就会报下面的错误
错误信息:Changing the delegate of a tab bar managed by a tab bar controller is not allowed.
错误意思:不允许修改TabBar的delegate属性(这个TabBar是被TabBarViewController所管理的)
3.系统控件为readonly(只读),利用KVC可以随意修改一个对象的属性或者成员变量(并且私有的也可以修改)
3.1 forKeyPath包含了forKey的功能,以后使用forKeyPath就可以了
3.2 forKeyPath中可以利用.运算符, 就可以一层一层往下查找对象的属性
3.3 下面这行代码过后,tabBar的delegate就是HWTabBarViewController
[selfsetValue:tabBar forKeyPath:@"tabBar"];相当于self.tabBar = tabBar;[self setValue:tabBar forKeyPath:@"tabBar"];说明,不用再设置tabBar.delegate = self;
四、NSKeyedArchiver和writeToFile的区别
1.NSKeyedArchiver
自定义对象的存储必须用NSKeyedArchiver,不再有什么writeToFile方法
[NSKeyedArchiver archiveRootObject:<#(nonnull id)#> toFile:<#(nonnull NSString *)#>];
2.writeToFile是NSDictionary和NSArray的方法
NSMutableDictionary *dictM = [NSDiNSMutableDictionaryctionary dictionary];[dictM writeToFile:<#(nonnull NSString *)#> atomically:<#(BOOL)#>];NSMutableArray *arrayM = [NSMutableArray array];[arrayM writeToFile:<#(nonnull NSString *)#> atomically:<#(BOOL)#>];
五、沙盒归档和解档
/** * 当一个对象要归档进沙盒中时,就会调用这个方法 * 目的:在这个方法中说明这个对象的哪些属性要存进沙盒 */ - (void)encodeWithCoder:(NSCoder *)encoder; /** * 当从沙盒中解档一个对象时(从沙盒中加载一个对象时),就会调用这个方法 * 目的:在这个方法中说明沙盒中的属性该怎么解析(需要取出哪些属性) */ - (id)initWithCoder:(NSCoder *)decoder;