美文网首页iOS文章iOS备忘录iOS Developer
iOS可自选切割角的圆角切割工具 (避免离屏渲染) - SKAr

iOS可自选切割角的圆角切割工具 (避免离屏渲染) - SKAr

作者: ShevaKuilin | 来源:发表于2017-03-29 00:02 被阅读839次

    原文出处 --->MyBlog

    最新更新

    • 解决使用Masonry布局无法及时获取frame信息的兼容问题

    • 解决使用border而导致的失效问题

    • 改为类方法,使用更加简单方便

    • 注意:如果之前设置了borderbackgroundColor请取消,关闭masksToBounds(如果打开了话), 请在方法中进行设置

    简述

    SKArchCutter,是一个可自选切割角的圆角切割工具,同时支持UIViewUIImageViewUIButtonUILabel的单角切圆/选角拱形切圆/全角切圆,并且避免了UIImageView使用系统圆角所导致的离屏渲染的问题,以及确保layer对象的masksToBounds属性始终为NO,从而使得项目中大量使用圆角时的性能得到很大程度的优化, 最重要的是使用简单、方便。如果觉得还不错,star支持下吧~

    为什么要避免离屏渲染?

    虽然说iOS 9.0之后苹果公司对离屏渲染做了处理,但是实际上我们仍需要考虑iOS 9.0之前的用户,所以对离屏渲染是处理还是必要的。

    这里就先不对离屏渲染做过多讲解了,关于离屏渲染的介绍,可以参考这篇文章

    我们先来说说离屏渲染的影响:

    在界面的滚动过程中如果有大量的离屏渲染发生时会严重影响帧率。

    那么离屏渲染会因为什么原因被触发呢:

    官方公开的的资料提到了尽量避免会触发离屏渲染的效果:mask, shadow, group opacity, edge antialiasing。

    使用系统提供的圆角效果也会触发离屏渲染, 如:
    imageView.layer.cornerRadius = 5
    imageView.layer.masksToBounds = YES

    当然,能够触发离屏渲染的因素远不止上述这些,这里仅仅是举例。

    SKArchCutter的作用是什么?

    • 方便、快捷的帮助你从任意边角进行圆角的切割(如:半圆矩形、只有一个角是圆角的矩形、整体圆角切割等)

    • 同时支持UIViewUIImageViewUIButtonUILabel

    • 避免了系统圆角导致的离屏渲染问题,确保layer对象的masksToBounds属性始终为NO,提升了大量使用圆角时的性能流畅性,减小了CPU和GPU的消耗

    • 避免了因工作线程的延迟,而导致图片闪烁的现象,这里学习了HJCornerRadius的思路

    效果图

    测试性能

    ps:录制的帧数已经跟不上屏幕滑动的速度了,足以说明滑动的流畅性有多高了

    如何开始

    1.从GitHub上Clone-->SKArchCutter,然后查看Demo

    2.直接将目录下的SKArchCutter拷贝到工程中,或在podfile文件夹中添加 pod 'SKArchCutter'

    3.觉得不错的话,点个star吧~

    使用方法

    头文件导入

    #import "SKArchCutter.h"
    

    进行圆角切割

    UIView/UIButton/UILabel

    [SKArchCutter cuttingView:self.centerView cuttingDirection:UIRectCornerTopRight | UIRectCornerTopLeft cornerRadii:self.centerView.frame.size.height / 2 borderWidth:1 borderColor:[UIColor purpleColor] backgroundColor:[UIColor redColor]];
    

    UIImageView

    [SKArchCutter cuttingImageView:self.topImageView cuttingDirection:UIRectCornerAllCorners cornerRadii:self.topImageView.frame.size.height / 2 borderWidth:1 borderColor:[UIColor blackColor] backgroundColor:[UIColor clearColor]];
    

    喜欢的话点个star哦~

    相关文章

      网友评论

      • Mr_yinwei:UiTalbeViewCell中的头像设置圆形,第一个总是不成功,其它都能设置成功,这是什么原因
        ShevaKuilin:@Mr_yinwei 可能是由于图片缓存导致的,这个库正在已经开始重构,我会尽快解决这些问题
      • 壹点微尘:demo 中 [self.archCutter cuttingWithObject:cell.imageView.image direction:UIRectCornerAllCorners cornerRadii:10]; cell.imageView.image 多写了个image
        ShevaKuilin:已更新0.0.4
        ShevaKuilin:@壹点微尘 多谢提醒
      • 大大东:有个疑问,不是说mask也会触发离屏渲染吗?为什么下面代码仍然是mask实现的圆角?
        - (void)cuttingView:(UIView *)view;
        {
        UIBezierPath * maskPath = [UIBezierPath bezierPathWithRoundedRect:view.bounds byRoundingCorners:self.direction cornerRadii:CGSizeMake(self.cornerRadii, self.cornerRadii)];
        CAShapeLayer * maskLayer = [[CAShapeLayer alloc] init];
        maskLayer.frame = view.bounds;
        maskLayer.path = maskPath.CGPath;
        view.layer.mask = maskLayer;
        }
        ShevaKuilin:该问题已解决
        ShevaKuilin:我刚才想象了几个应用场景,针对你这个问题,我确实有考虑不周的地方,比如:列表中的按钮也需要使用圆角,以及列表上的baseView也是应用了圆角的话,如果列表数量庞大就会产生大量的渲染,那么这里的mask对性能就可能产生影响,我会尽快修复这个问题,感谢你的关注:+1:
        ShevaKuilin:@大大东 这里主要针对UIImageView做了离屏渲染处理,因为考虑到在实际应用当中,列表中的大量圆角应用主要是UIImageView,只有当使用圆角的量达到一定程度时,才会产生这种对性能上明显的影响,如果不多的话,比如只有一个,或者个别几个使用了mask,对性能上的影响可以忽略不计的,而且通常对我们性能影响最大的不是mask,而是使用系统圆角时的masksToBounds。当然,最好的情况是全部不使用mask,这里我偷了个小懒,稍后会你提问对这里进行一个处理。

      本文标题:iOS可自选切割角的圆角切割工具 (避免离屏渲染) - SKAr

      本文链接:https://www.haomeiwen.com/subject/flbsottx.html