UIbutton等控件圆角设置

普通圆角按钮

在平时的开发中,一般不用图片来显示圆角按钮,以减少包大小,代码如下,

UIButton *doneBtn = [UIButton buttonWithType:UIButtonTypeCustom];
doneBtn.frame = CGRectMake(0,0,40,20);
doneBtn.backgroundColor = [UIColor redColor];
//设置圆角的大小
doneBtn.layer.cornerRadius = 3;
//此行代码必须有(UIView例外)
doneBtn.layer.masksToBounds = YES;
doneBtn.titleLabel.font = [UIFont systemFontOfSize:15];
[doneBtn setTitle:@"按钮" forState:UIControlStateNormal];
[doneBtn addTarget:self     action:@selector(clickdoneWithButton:)  forControlEvents:UIControlEventTouchUpInside];

离屏渲染

以上方法只适用于一个界面只有几个按钮,如果是大量的按钮,如UITableViewCell上那么就会出现卡顿,造成这个原因就是离屏渲染。
所谓离屏渲染指的是GPU在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作。
而以下一些行为都会触发离屏渲染
shouldRasterize(光栅化)
masks(遮罩)
shadows(阴影)
edge antialiasing(抗锯齿)
group opacity(不透明)
这里我们设置了masksToBounds属性,所以会触发离屏渲染,因而卡顿。
还有一种方式可以查看是否有离屏渲染,就是 Instruments->Core Animation,至于怎么使用请看我另一篇文章”Core Animation的使用”
既然不能使用masksToBounds,那怎么设置圆角呢?其实绘制一个圆角的图铺在控件底层,实现代码如下

@implementation UIImage (CornerRadius)
- (UIImage *)chh_imageWithRoundedCornersAndSize:(CGSize)sizeToFit andCornerRadius:(CGFloat)radius
{   
CGRect rect = (CGRect){0.f, 0.f, sizeToFit};
UIGraphicsBeginImageContextWithOptions(sizeToFit, NO, UIScreen.mainScreen.scale);
CGContextAddPath(UIGraphicsGetCurrentContext(),
[UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:4].CGPath);
CGContextClip(UIGraphicsGetCurrentContext());
[self drawInRect:rect];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
@end

这样就可以防止离屏渲染了,至于想知道离屏渲染更多信息可以百度,我也就不啰嗦了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 绘制像素到屏幕上 answer-huang22 Mar 2014 分享文章 一个像素是如何绘制到屏幕上去的?有很多...
    阿狸旅途T恤阅读 1,649评论 0 7
  • 卷首语 欢迎来到 objc.io 的第三期! 这一期都是关于视图层的。当然视图层有很多方面,我们需要把它们缩小到几...
    评评分分阅读 1,796评论 0 18
  • README: 引言: 一款优秀的app,流畅很关键,用户使用60的fps的app,跟使用30的fps的app感受...
    uncleRX阅读 30,665评论 31 236
  • 在布鲁斯步道(Bruce Trail)上,有很多路段可以欣赏尼加拉瓜陡坡(escarpment)所特有的悬崖,20...
    田园读书人阅读 1,257评论 0 5
  • 阿飞知道自己是复制人。 记忆是植入的,肉体是增强的,和自己一样叼的还有1008个。 然而永生的阿飞只想躺在床上当虫子。
    阿飞88阅读 97评论 0 0