我正在使用这段代码来修整我的一个角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 上全屏显示,所以我担心这么大的遮罩的性能(我的遮罩中会有不止一个这样的遮罩)用户界面)。另外,超大尺寸的面罩不适用于我需要鞋面的情况right角(单独)要圆滑。
有没有更简单、更容易的方法来实现这一目标?
Update: 这就是我想要实现的目标:https://i.stack.imgur.com/dPBC9.png https://i.stack.imgur.com/dPBC9.png(我想要的圆角在这里用绿色圈出)。
我已经实现了它的工作版本,使用的子类UINavigationController
并压倒一切viewDidLayoutSubviews
像这样:
- (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
使用我的视图控制器进行子类化,然后将导航控制器视图的框架偏移 20px (y) 以暴露状态栏并留下 44 px 高的导航栏,如图所示。
该代码可以正常工作,只是它根本不能很好地处理旋转。当应用程序旋转时,viewDidLayoutSubviews
被叫到before旋转和我的代码创建了一个适合视图的蒙版after回转;这会给旋转带来不希望的块效应,其中应该隐藏的位在旋转期间暴露出来。此外,虽然在没有此遮罩的情况下应用程序的旋转非常平滑,但创建遮罩后,旋转变得明显不稳定且缓慢。
iPad 应用程序 Evomail 也有这样的圆角,他们的应用程序也遇到同样的问题。