UI视图

一、事件传递 & 响应

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;
复制代码

二、图像显示

CPU工做内容

GPU渲染

三、UI卡顿、掉帧

滑动优化方案

CPU异步

  • 对象建立,调整,销毁
  • 预排版(布局计算、文本计算)
  • 预渲染(文本等异步绘制,图片编解码等)

GPUide

  • 纹理渲染(离屏渲染(Layer圆角和maskToBounds,阴影图层,基于CPU的异步绘制原理减轻GPU的压力))
  • 视图混合

四、UI绘制原理 & 异步绘制

系统绘制流程

异步绘制
[layer.delegate displayLayer];
复制代码
  • 代理负责生产对应的bitmap
  • 设置bitmap做为layer.contents属性的值

五、离屏渲染

  • On-Screen Rendering GPU的渲染操做在当前用于显示的屏幕缓冲区中进行
  • Off-Screen Rendering GPU在当前屏幕缓冲区之外新开辟一个缓冲区进行渲染操做
为何要避免离屏渲染?
  • 建立新的渲染缓冲区
  • 上下文切换
相关文章
相关标签/搜索