iOS UI视图相关深入

2018/12/28 posted in  iOS基础概念

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 这是一个被重复调用的函数。重复调用会造成内存问题。

自动布局

  1. 更新约束
  2. 布局阶段
  3. 显示

updateConstraints(),不手动调用和layoutSubviews类似
updateConstraintsIfNeeded(), 和layoutIfNeeded类似
setNeedsUpdateConstraints(),和setNeedsLayout类似

intrinsicContentSize 属性,根据内容自然得到的属性。

视图布局更新与runloop的关系