我正在使用下面的代码来圆角化我的UIView
的一个角:
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:
self.view.bounds byRoundingCorners:(UIRectCornerTopLeft) cornerRadii:
CGSizeMake(10.0, 10.0)];
CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
maskLayer.frame = self.view.bounds;
maskLayer.path = maskPath.CGPath;
self.view.layer.mask = maskLayer;
self.view.layer.masksToBounds = NO;
只要我不调整视图大小,这段代码就可以工作。如果我将视图放大,新区域不会出现,因为它超出了遮罩层的边界(这个遮罩层不会自动随着视图调整大小)。我可以让遮罩层尽可能大,但在iPad上可能会全屏显示,所以我担心使用如此大的遮罩会影响性能(我的UI中会有多个这样的元素)。此外,一个超大的遮罩无法满足我需要单独将右上角圆角化的情况。
有没有更简单、更容易实现的方法呢?
更新:我想要实现的效果如下: http://i.imgur.com/W2AfRBd.png (我想要的圆角在这里用绿色圈圈标出)。
我已经通过重写 viewDidLayoutSubviews
的方式,在UINavigationController
的子类中实现了这个效果。
- (void)viewDidLayoutSubviews {
CGRect rect = self.view.bounds;
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:rect
byRoundingCorners:UIRectCornerTopLeft cornerRadii:CGSizeMake(8.0, 8.0)];
self.maskLayer = [CAShapeLayer layer];
self.maskLayer.frame = rect;
self.maskLayer.path = maskPath.CGPath;
self.view.layer.mask = self.maskLayer;
}
我使用我的视图控制器实例化了一个
UINavigationController
子类,然后将导航控制器视图的框架向下偏移20像素(y)以显示状态栏并留出44像素高的导航栏(如图片所示)。这段代码可以正常工作,但它不能很好地处理旋转。当应用程序旋转时,
viewDidLayoutSubviews
在旋转之前就被调用,而我的代码则在旋转后创建了一个适合视图的遮罩层。这会导致旋转时一些本该被隐藏的部分暴露出来,从而产生不良的块状效果。而且,在没有遮罩的情况下,应用程序的旋转是非常平滑的,但在有了遮罩���后,旋转会变得明显卡顿和缓慢。iPad应用程序Evomail也有像这样的圆角,并且他们的应用程序也遇到了同样的问题。