iOS事件传递的需要思考的问题
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {}
最终将这个fitView给了谁?
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { }
到底是谁在调用的?
经研究,最终将这个view给了UIWindow,UIWindow调用这个fitView得touchBegan方法。
整个事件首先在Application的事件队列里,然后通过UIWindow在view层级里是先从最后面的子view进行hitTest;找到fitView,然后将touch事件派发给它处理。或者view里有手势会先派发事件给手势处理。手势识别后会取消派发给fitView,UIWindow会调用fitView的touchBegan方法。后面的响应链条上touchBegan会被Pre-responder调用。若果不重写touchBegan,pre-responder会默认递归回溯调用。
手势识别的内部调用机制?
TouchBegan,UIControl,手势识别关系?
iOS 布局
Frame布局
layoutSubviews,不手动调用
layoutIFNeeded(),在同一个循环里如果需要更新就执行layoutSubviews,然后放回。也就是在layoutIFNeeded里会做判定并且调用本类的layoutSubviews;
setNeedsLayout(),只要告诉标记需要更新界面,在下一个循环里会有一个检测是否需要更新UI布局的一个点来执行layoutSubviews,
- drawRect 这是一个被重复调用的函数。重复调用会造成内存问题。
自动布局
- 更新约束
- 布局阶段
- 显示
updateConstraints(),不手动调用和layoutSubviews类似
updateConstraintsIfNeeded(), 和layoutIfNeeded类似
setNeedsUpdateConstraints(),和setNeedsLayout类似
intrinsicContentSize 属性,根据内容自然得到的属性。