【问题标题】:UIView Rounded Corners Without a Mask Layer没有遮罩层的 UIView 圆角
【发布时间】:2012-11-05 20:59:17
【问题描述】:

我正在构建一个 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

这可行,但是当我拉起上拉菜单时会出现严重的帧丢失/延迟(请注意,菜单重叠,出现在图表顶部)。当我去掉圆角时,菜单很漂亮。据我所知,我需要一种通过直接修改视图而不是使用遮罩层来圆角的方法。有谁知道我该如何解决这个问题或有其他可能的解决方案?非常感谢任何帮助

【问题讨论】:

    标签: objective-c ios uiview core-animation core-graphics


    【解决方案1】:

    据我所知,我需要一种直接绕过角落的方法 修改视图,而不是使用遮罩层。有谁知道我怎么 可以解决这个问题或有其他可能的解决方案吗?

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

    myView.layer.cornerRadius = 10.0;
    

    这样就不需要遮罩层或贝塞尔路径。在您的方法的上下文中,它将是:

    -(void)setRoundedCorners:(UIRectCorner)corners radius:(CGFloat)radius
    {
        self.layer.cornerRadius = radius;
    }
    

    更新:抱歉——我错过了这部分:

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

    如果您只想一些圆角,则无法通过设置图层的cornerRadius 属性来实现。您可以采取两种方法:

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

    • 使用可调整大小的图像。请参阅 UIImage 的 -resizableImageWithCapInsets: 和 -resizableImageWithCapInsets:resizingMode: 方法。甚至还有一些方法可以为可调整的图像设置动画,因此您可以轻松地将条形图增长到合适的长度。

    【讨论】:

    • 当你说“创建一个贝塞尔路径......然后填充它”时可能会令人困惑。你的意思是覆盖drawRect还是使用CAShapeLayer。使用 CAShapeLayer 可能更简单,但他需要对这两个选项进行基准测试,看看哪个表现更好。
    【解决方案2】:

    尝试在您的图层上设置shouldRasterize。应该有帮助。

    【讨论】:

    • 在视图层或遮罩层或两者上?
    • 是的,它对延迟/帧丢失没有影响。在我上面的代码中,您可以看到我已经在图层上设置了它。
    • 抱歉,没看到。然后考虑手动展平您的图表或各个条形,以便您可以将它们替换为 CGImageRefs/UIImageViews
    • shouldRasterize 会有所帮助,但请确保您设置为圆形视图的父视图之一。创建一个足够大的超级视图来包裹圆形视图并设置标志也是一个好习惯。
    猜你喜欢
    • 2016-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-17
    相关资源
    最近更新 更多