使用 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)