UI视图

UI视图

IOS小彩虹2021-08-18 23:35:15180A+A-

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在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作
为什么要避免离屏渲染?
  • 创建新的渲染缓冲区
  • 上下文切换

点击这里复制本文地址 以上内容由权冠洲的博客整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!

支持Ctrl+Enter提交

联系我们| 本站介绍| 留言建议 | 交换友链 | 域名展示
本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除

权冠洲的博客 © All Rights Reserved.  Copyright quanguanzhou.top All Rights Reserved
苏公网安备 32030302000848号   苏ICP备20033101号-1
本网站由 提供CDN/云存储服务

联系我们