instancetype 与 id的区别
instancetype在类型表示上,跟id一样,可以表示任何对象类型
instancetype只能用在返回值类型上,不能像id一样用在参数类型上
instancetype比id多一个好处:编译器会检测instancetype的真实类型
UIView封装
如果一个view内部的子控件比较多,一般会考虑自定义一个view,把它内部子控件的创建屏蔽起来,不让外界关心
外界可以传入对应的模型数据给view,view拿到模型数据后给内部的子控件设置对应的数据
封装控件的基本步骤
- 在initWithFrame:方法中添加子控件,提供便利构造方法
- 在layoutSubviews方法中设置子控件的frame(一定要调用super的layoutSubviews)
- 增加模型属性,在模型属性set方法中设置数据到子控件上
常见问题
- 项目里面的某个.m文件无法使用
- 检查:Build Phases -> Compile Sources
- 项目里面的某个资源文件(比如plist、音频等)无法使用
- 检查:Build Phases -> Copy Bundle Resources
模型
- 什么是模型?
- 专门用来存放数据的对象
- 一般都是一些直接继承自NSObject的纯对象
- 内部会提供一些属性来存放数据
一个控件看不见有哪些可能?
- 宽度或者高度其实为0
- 位置不对(比如是个负数或者超大的数,已经超出屏幕)
- hidden == YES
- alpha <= 0.01
- 没有设置背景色、没有设置内容
- 可能是文字颜色和背景色一样
九宫格计算思路
- 利用控件的索引index计算出控件所在的行号和列号
NSInteger index = self.view.subviews.count;
- 利用列号计算控件的x值
- 利用行号计算控件的y值
HUD
- 其他说法:指示器、遮盖、蒙板
- 半透明HUD的做法
- 背景色设置为半透明颜色
UIView查找,添加,删除subview的方法
- 查找:
[self.view viewWithTag:1];
- 添加或顺序插入:
UISwitch *s = [[UISwitch alloc] init];
UIStepper *stepper = [[UIStepper alloc]
init];
//添加子视图
[self.view addSubview:stepper];
[self.view addSubview:s];
UISlider *slider = [[UISlider alloc] init];
//添加在指定子视图下面
[self.view insertSubview:slider belowSubview:s];
//添加在指定子视图上面
[self.view insertSubview:slider aboveSubview:stepper];
- 移除指定tag值得子视图:
[[self.view viewWithTag:1] removeFromSuperview];