使用 UIBezierPath 的圆角半径

Posted

技术标签:

【中文标题】使用 UIBezierPath 的圆角半径【英文标题】:Corner Radius Using UIBezierPath 【发布时间】:2016-01-20 10:33:36 【问题描述】:

我正在尝试使用“UIBezierPath”来绕过我的视图。我只需要将 topRight 和 Top left 舍入即可。

我使用了以下代码

 -(void)setMaskOnView:(UIView *)givenView
  
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:givenView.bounds byRoundingCorners: (UIRectCornerTopLeft|UIRectCornerTopRight) cornerRadii:CGSizeMake(10.0, 10.0)];
CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
maskLayer.frame = givenView.bounds;
maskLayer.path  = maskPath.CGPath;
givenView.layer.mask = maskLayer;
 

但我的右上角不圆。

我用过

UIRectCornerAllCorners

但它不圆我的右角

我有什么遗漏吗??

【问题讨论】:

你在哪里打电话给setMaskOnView?可能在布局完成之前。因此,边界尚未正确设置,将/确实会改变。 givenView.bounds 更改为 givenView.superview.bounds 并检查是否有效 @luk2302 我在 viewDidLoad 中调用它 你去 - 那是错误的地方,你必须在布局改变时设置掩码。 但是为什么左手是四舍五入的呢?? 【参考方案1】:

我建议不同的方法。加载带有圆角顶角的图像并设置为CALayer 的内容。将此图层设置为视图图层的蒙版。在给定视图的layoutSubivews 或给定视图控制器的viewDidLayoutSubviews 中更新遮罩层的大小。

加载图像作为图层内容

CALayer *maskLayer = [[CALayer alloc] init];
UIImage *maskImage = [UIImage imageNamed:@"mask_image.png" inBundle:[NSBundle mainBundle] compatibleWithTraitCollection:nil];
maskLayer.contents = (__bridge id _Nullable)(maskImage.CGImage);

mainLayer.mask = maskLayer

[编辑] 在 cmets 中回答您的问题

使用 CAShapeLayer 或图像作为蒙版,您必须调整蒙版图层的大小,使其与蒙版图层的大小相同。如果我们在谈论 UITableViewCell 创建您自己的派生单元格并更新 layoutSubviews 中的蒙版形状。下面是示例代码(MyTableCell 是从故事板加载的):

@interface MyTableCell ()

@property (nonatomic, strong) CAShapeLayer *maskLayer;

@end

@implementation MyTableCell

- (void)awakeFromNib

    self.maskLayer = [[CAShapeLayer alloc] init];
    self.layer.mask = self.maskLayer;


- (void)layoutSubviews

    [super layoutSubviews];
    self.maskLayer.path = [self maskPath].CGPath;


- (UIBezierPath *)maskPath

    return [UIBezierPath bezierPathWithRoundedRect:self.bounds byRoundingCorners: (UIRectCornerTopLeft|UIRectCornerTopRight) cornerRadii:CGSizeMake(10.0, 10.0)];



@end

【讨论】:

【参考方案2】:

我正在使用这个子类

.h

@interface UIView (custom)

- (UIView *)setRoundedCorners:(UIRectCorner)corners withRadius:(CGFloat)radius;

@end

.m

@implementation UIView (custom)

    - (UIView *)setRoundedCorners:(UIRectCorner)corners withRadius:(CGFloat)radius
    
        UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds
                                                       byRoundingCorners:corners
                                                             cornerRadii:CGSizeMake(radius, radius)];

        CAShapeLayer *maskLayer = [CAShapeLayer layer];

        maskLayer.frame = self.bounds;

        maskLayer.path = maskPath.CGPath;

        self.layer.mask = maskLayer;

        return self;
    
@end

像这样使用它:

[YOURVIEW setRoundedCorners:UIRectCornerBottomLeft | UIRectCornerBottomRight | UIRectCornerTopLeft | UIRectCornerTopRight withRadius:15];

【讨论】:

以上是关于使用 UIBezierPath 的圆角半径的主要内容,如果未能解决你的问题,请参考以下文章

像在绘图应用程序中一样指定具有角半径的 UIBezierPath 点(例如 Sketch)

右上角和左上角半径无法正常工作

使用 UIBezierPath 的圆角多边形

使用 UIBezierPath 的带有圆角的 TableView 页眉和页脚

仅将角半径设置为 UIView/UIButton 的特定侧

如何将圆角添加到 UIBezierPath 自定义矩形?