Objective c UIView不带遮罩层的圆角

Objective c UIView不带遮罩层的圆角,objective-c,ios,uiview,core-animation,core-graphics,Objective C,Ios,Uiview,Core Animation,Core Graphics,我正在构建一个iPad应用程序,其中包括几个条形图(每个图形30+条)和屏幕底部的下拉菜单。这种设计要求这些酒吧在左上角和右上角具有圆角,但在左下角和右下角具有方形 现在,我正在使用遮罩层将每个图形条的上角圆角: #import "UIView+RoundedCorners.h" #import <QuartzCore/QuartzCore.h> @implementation UIView (RoundedCorners) -(void)setRoundedCorners:(U

我正在构建一个iPad应用程序,其中包括几个条形图(每个图形30+条)和屏幕底部的下拉菜单。这种设计要求这些酒吧在左上角和右上角具有圆角,但在左下角和右下角具有方形

现在,我正在使用遮罩层将每个图形条的上角圆角:

#import "UIView+RoundedCorners.h"
#import <QuartzCore/QuartzCore.h>

@implementation UIView (RoundedCorners)

-(void)setRoundedCorners:(UIRectCorner)corners radius:(CGFloat)radius {
    CGRect rect = self.bounds;

    // Create the path 
    UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:rect 
                                                   byRoundingCorners:corners
                                                         cornerRadii:CGSizeMake(radius, radius)];

    // Create the shape layer and set its path
    CAShapeLayer *maskLayer = [CAShapeLayer layer];
    maskLayer.frame = rect;
    maskLayer.path = maskPath.CGPath;

    // Set the newly created shape layer as the mask for the view's layer
    self.layer.mask = maskLayer;
    self.layer.shouldRasterize = YES;
}

@end
#导入“UIView+RoundedCorners.h”
#进口
@实现UIView(圆角)
-(void)setRoundedCorners:(UIRectCorners)拐角半径:(CGFloat)半径{
CGRect rect=自边界;
//创建路径
UIBezierPath*maskPath=[UIBezierPath bezierPathWithRoundedRect:rect
byRoundingCorners:角点
角半径:CGSizeMake(半径,半径)];
//创建形状层并设置其路径
CAShapeLayer*maskLayer=[CAShapeLayer层];
maskLayer.frame=rect;
maskLayer.path=maskPath.CGPath;
//将新创建的形状层设置为视图层的遮罩
self.layer.mask=maskLayer;
self.layer.shouldRasterize=是;
}
@结束
这是可行的,但当我拉起下拉菜单时,会出现严重的帧丢失/延迟(请注意,菜单重叠,出现在图表顶部)。当我去掉这些圆角时,菜单就很漂亮了。从我收集的资料来看,我需要一种通过直接修改视图而不是使用遮罩层来圆角的方法。有人知道我怎样才能做到这一点,或者有其他可能的解决办法吗?非常感谢您的帮助

从我收集的资料来看,我需要一种直接通过 修改视图,而不是使用遮罩层。有人知道我是怎么做的吗 你能做到这一点或者有其他可能的解决方案吗

通常的方法是获取视图的图层并设置
cornerRadius
属性:

myView.layer.cornerRadius = 10.0;
这样就不需要遮罩层或贝塞尔路径。在您的方法上下文中,应该是:

-(void)setRoundedCorners:(UIRectCorner)corners radius:(CGFloat)radius
{
    self.layer.cornerRadius = radius;
}
更新:抱歉--我错过了这一部分:

设计要求这些酒吧顶部有圆角 左上角和右上角,但左下角和 右下角

如果您只希望圆角部分角,则无法通过设置层的
cornerRadius
属性来实现。您可以采取两种方法:

  • 创建一个具有两个圆角和两个正方形的贝塞尔路径,然后填充它。不需要遮罩层就可以做到这一点

  • 使用可调整大小的图像。请参见UIImage的
    -resizebleimagewithcapinsets:
    -resizebleimagewithcapinsets:resizingMode:
    方法。甚至有一些方法可以为可重化图像设置动画,因此您可以轻松地将条形图增长到正确的长度

从我收集的资料来看,我需要一种直接通过 修改视图,而不是使用遮罩层。有人知道我是怎么做的吗 你能做到这一点或者有其他可能的解决方案吗

通常的方法是获取视图的图层并设置
cornerRadius
属性:

myView.layer.cornerRadius = 10.0;
这样就不需要遮罩层或贝塞尔路径。在您的方法上下文中,应该是:

-(void)setRoundedCorners:(UIRectCorner)corners radius:(CGFloat)radius
{
    self.layer.cornerRadius = radius;
}
更新:抱歉--我错过了这一部分:

设计要求这些酒吧顶部有圆角 左上角和右上角,但左下角和 右下角

如果您只希望圆角部分角,则无法通过设置层的
cornerRadius
属性来实现。您可以采取两种方法:

  • 创建一个具有两个圆角和两个正方形的贝塞尔路径,然后填充它。不需要遮罩层就可以做到这一点

  • 使用可调整大小的图像。请参见UIImage的
    -resizebleimagewithcapinsets:
    -resizebleimagewithcapinsets:resizingMode:
    方法。甚至有一些方法可以为可重化图像设置动画,因此您可以轻松地将条形图增长到正确的长度


尝试在图层上设置
应光栅化。应该有帮助。

尝试在图层上设置
应光栅化。应该有帮助。

在视图层或遮罩层或两者上?是的,它对延迟/帧丢失没有影响。在我上面的代码中,你可以看到我已经在图层上设置了它。对不起,没有看到。然后考虑手动调整你的图表,或者单独的栏,这样你就可以用CGIMAIGReFEs/UIIVIEVIEWS替换:代码> BuffDeReStudio会有所帮助,但是确保你正在设置为圆形视图的父视图之一。创建一个足够大的superview来包装圆角视图并设置标志也是一个很好的做法。在视图层或遮罩层或两者上?是的,它对延迟/帧损失没有影响。在我上面的代码中,你可以看到我已经在图层上设置了它。对不起,没有看到。然后考虑手动调整你的图表,或者单独的栏,这样你就可以用CGIMAIGReFEs/UIIVIEVIEWS替换:代码> BuffDeReStudio会有所帮助,但是确保你正在设置为圆形视图的父视图之一。创建一个足够大的superview来包装您的圆形视图并设置标志也是一个很好的做法。当您说“创建一个bezier路径…然后填充它”时,可能会让人困惑。您的意思是覆盖drawRect还是使用CAShapeLayer。使用CAShapeLayer可能更简单,但他需要对这两个选项进行基准测试,看看哪一个性能更好。当你说“创建一个bezier路径……然后填充它”时,可能会让人困惑。您的意思是覆盖drawRect还是使用CAShapeLayer。使用CAShapeLayer可能更简单,但他需要对这两个选项进行基准测试,看看哪一个性能更好。