【发布时间】:2014-01-23 02:45:10
【问题描述】:
我正在使用此代码将我的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 上是全屏的,所以我担心这么大的面具的性能(我会在我的用户界面)。此外,超大尺寸的蒙版不适用于我需要将右上角(单独)修圆的右上角。
有没有更简单、更容易的方法来实现这一点?
更新:这是我想要实现的目标:http://i.imgur.com/W2AfRBd.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 像素高的导航栏,如图所示图片。
代码可以正常工作,只是它根本不能很好地处理旋转。当应用程序旋转时,viewDidLayoutSubviews 被调用 before 旋转,我的代码创建了一个适合视图 after 旋转的掩码;这会对旋转产生不希望的阻塞,在旋转过程中应该隐藏的位会暴露出来。此外,虽然没有此蒙版,应用的旋转非常平滑,但创建蒙版后,旋转变得明显不平稳且缓慢。
iPad 应用 Evomail 也有这样的圆角,他们的应用也存在同样的问题。
【问题讨论】:
-
你能贴一张现有解决方案的图片吗,我无法想象你想要什么
-
@WarrenBurton:看看我的编辑,谢谢。
-
我感受到了你的痛苦……当设计师想要一些看起来很简单的东西时……我可以这样做是使用cornerRadius,然后将其他3个角隐藏在屏幕外。始终将框架设置为比可见量大得多。如果您需要显示整个视图,可以尝试用圆角视图后面的视图来假装其他 3 个角......把它扔在这里
-
@JackWu:是的,一种可行的解决方案是在开始时创建一个蒙版,左上角为圆形,高度和宽度为 1024。问题是这只是一个例子 - 设计师实际上希望所有四个角都是圆形的。
-
@MusiGenesis 查看我对您问题的解决方案。效果很好。