普通圆角按钮
在平时的开发中,一般不用图片来显示圆角按钮,以减少包大小,代码如下,
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
这样就可以防止离屏渲染了,至于想知道离屏渲染更多信息可以百度,我也就不啰嗦了。
网友评论