1、事件传递 & 响应
UIView/CALayer
- UIView提供内容,负责处理触摸等事件,继承UIResponsder
- CALayer负责内容显示
事件传递
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
if (!self.userInteractionEnabled || [self isHidden] || self.alpha <= 0.01) {
return nil;
}
if ([self pointInside:point withEvent:event]) {
__block UIView *hit = nil;
[self.subviews enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
CGPoint convertPoint = [self convertPoint:point toView:obj];
hit = [obj hitTest:convertPoint withEvent: event];
if (hit) {
*stop = YES;
}
}];
if (hit) {
return hit;
} else {
return self;
}
} else {
return nil;
}
}
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
CGFloat x1 = point.x;
CGFloat y1 = point.y;
CGFloat x2 = self.frame.size.width / 2;
CGFloat y2 = self.frame.size.height / 2;
double dis = sqrt((X1 - X2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
if (dis <= self.frame.size.width / 2) {
return YES;
} else {
return NO;
}
}
事件响应
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchsMoved:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchedEnded:(NSSet *)touches withEvent:(UIEvent *)event;
2、图像显示
CPU工作内容
GPU渲染
3、UI卡顿、掉帧
滑动优化方案
CPU
- 对象创建,调整,销毁
- 预排版(布局计算、文本计算)
- 预渲染(文本等异步绘制,图片编解码等)
GPU
- 纹理渲染(离屏渲染(Layer圆角和maskToBounds,阴影图层,基于CPU的异步绘制原理减轻GPU的压力))
- 视图混合
4、UI绘制原理 & 异步绘制
系统绘制流程
异步绘制
[layer.delegate displayLayer];
- 代理负责生产对应的bitmap
- 设置bitmap作为layer.contents属性的值
5、离屏渲染
- On-Screen Rendering GPU的渲染操作在当前用于显示的屏幕缓冲区中进行
- Off-Screen Rendering GPU在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作
为什么要避免离屏渲染?
- 创建新的渲染缓冲区
- 上下文切换