0

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

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

4

2 回答 2

4

据我所知,我需要一种通过直接修改视图而不是使用遮罩层来圆角的方法。有谁知道我该如何解决这个问题或有其他可能的解决方案?

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

myView.layer.cornerRadius = 10.0;

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

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

更新:对不起 - 我错过了这部分:

设计要求这些条在左上角和右上角有圆角,但在左下角和右下角有方角

如果你只想要一些圆角,你不能通过设置图层的cornerRadius属性来做到这一点。您可以采取两种方法:

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

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

于 2012-11-05T21:03:54.113 回答
1

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

于 2012-11-05T21:38:45.903 回答