如何进行接口设计
- 首先要考虑最终要实现的功能,满足此功能
- 考虑到未来再重复使用此功能的伸缩性,传递对应的参数进去
- 使外部使用此接口的方式,尽可能的简便,接口内部的实现对外界屏蔽
- 检验使用此接口的细节,在接口内部的参数与方法命名上通俗易懂,例如:add、remove,imageName(覆盖,第二次调用时需要对前一次进行清除)等等
消息循环
- 例如对于一个UIScrollView控件的多种属性修改,并不是设置了就立即调到相应的方法中进行修改,而是在一次循环中收集所有的修改,在没有外部干扰的情况下,方法结束后进行一次性的更改
- 外部干扰,例如touchesBegan,这是UIView的共有属性
UIView的3种初始化方法
在学习swift的时候,一直以来清楚为什么会有initWithCoder的存在,现在清楚了。
- init,会调用initWithFrame:(CGRect)frame。
- initWithFrame:(CGRect)frame,传递frame参数来构造UIView。
- initWithCoder:(NSCoder *)aDecoder,在使用xib\storyboard的时候调用,是对xib\storyboard文件的解析。在xib\storyboard文件中进行了控件的创建以及设置,initWithCoder相当于一个解析器。
- 在这里讲一个对比的函数:awakeFromNib(storyboard的前身也是nib),字面意思是从Nib中醒来,与initWithCoder不同的地方在于:initWithCoder只是完成了控件的创建,awakeFromNib是在完成了连线的赋值之后进行调用;awakeFromNib,无论是自创建控件还是从xib\storyboard中创建,都会调用。
框架
- 框架的升级问题:当一个框架进行了升级之后,之前的接口可能会发生改变,那么任何使用该接口的app可能会发生bug,那么现在问题来了,苹果更新的iOS系统,那么旧有的app都不能使用了吗?
- 有时候敲代码的时候,会发现有些方法中间划了红线,这是被苹果遗弃的iOS旧系统中的方法,仍旧能用,但是苹果不推荐使用。
- 在我们平常设计框架并以后更新的时候,在升级新接口的同时,也可以保留旧有的接口,增加关键字如下:
//objc
@property (nonatomic, strong) UIColor *otherColor NS_DEPRECATED_IOS(2_0,3_0);
NSTimer
//objc
//创建了定时器,但是并未启动
[NSTimer timeWithTimeInterval:1.5 target:self selector:@selector(nextPage) userInfo:nil, repeats:YES];
//创建并默认启动了定时器
self。timer = [NSTimer scheduledTimerWithTimeInterval:(NSTimeInterval) target:(id) selector:(SEL) userInfo:(id) repeats:(BOOL)];
//启动定时器
[self.timer fire]
//关闭定时器
[self.timer invalidate]
- 线程
- 正常情况下,在单核机器中,一个app是运行在一个主线程中,但是当设置定时器以后,如果用户界面发生了交互,会暂时屏蔽定时器的走动。
- 究其原因,是因为定时器的优先级较低,通过设置NSRunLoop mainRunLoop 通用模式,使其与UI有同层的优先级。
屏幕适配的发展历史,重要:AutoLayout
小码哥讲解了自动布局发展的历史,在iOS系统初期,使用的是代码的方式;中期使用了autoResizing方式;现在使用AutoLayout。但是AutoLayout是将代码简化到了属性的设置中,使得autoLayout比较方便,但是自定义控件使用autoLayout代码的方式仍旧特别麻烦。之前接触过autoLayout代码的设置方式,觉得自己天资愚笨,就放弃了,原来这个都不受大家待见。
- 针对不同版本的操作系统 以及 不同大小的屏幕尺寸进行适配。
- 使用AutoLayout之后,不推荐使用frame \ bounds \ center,有时设置会起作用,有时候并不起作用。忘掉frame,拥抱aotuLayout。
- autoResizing与autoLayout的区别是:autoResizing只能对父子控件进行位置与大小设置,而autoLayout既可以作用于父子控件,也可以作用于兄弟控件,它可以作用于任何两个控件之间。
- 使用autoResizing的前提是:需要关闭autoLayout功能。
- autoLayout的核心概念:参照、约束。对于一个控件,给其一个参照的控件,然后在这两者之间设置约束。
- 除了UIViewController中的控件可以拖线之外,控件间的约束也可以拖线,然后可以直观的对约束变量进行设置。
视网膜屏幕 retina高清屏幕
- 像素与点的认识:点是面向程序员的,像素是面向用户的,像素与点之间是倍数关系,方便程序员进行多种iOS尺寸的设计。
Ember Library Mediator.png
UITextField
- UITextField 的父类是 UIScrollView
- UITextFied 中的长度设置: Less Than or Equal \ Equal \ Greater Than or Equal,当UITextField中的text会变动,设置Less Than or Equal 会设置最大的长度,在这个范围内随着text变动而缩小。
- 例如:UIView中装着子控件UITextField,UIView随着UITextField中text的变化,而进行伸缩。设置UITextField与UIView底部的距离即可,也可以通过设置UIView的底部 = UITextField 的底部 + 20
tips
- 有时候程序运行出现这样的BUG CUICatalog:Unvalid asset name supplied: (null),是因为在[UIImage imageNamed:name]传递的参数name = null
- Masonry 第三方框架,使代码写约束的过程变得更加方便
- drawRect方法,是控件共有的一种方法
- UIView中自控件的动画设置,主意增加layoutIfNeeded
//objc
[UIView animateWithDurationn:2.0 animations: ^{
[self.blueView layoutIfNeeded];
}];
- arc4random_uniform(max) 方法产生一个随机值,不大于max
- 让subviews数组中的所有对象都执行同样的方法
//objc
[self.scrollView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];