UIBezierPath 在右上角和右下角不起作用

Posted

技术标签:

【中文标题】UIBezierPath 在右上角和右下角不起作用【英文标题】:UIBezierPath doesn't work in TopRight corner and BottomRight corner 【发布时间】:2016-02-28 17:23:00 【问题描述】:

我想圆我的右角,但只适用于左角

let path = UIBezierPath(roundedRect: view.bounds, byRoundingCorners: [UIRectCorner.TopLeft, UIRectCorner.TopRight], cornerRadii: CGSizeMake(20.0, 20.0))
let maskLayer = CAShapeLayer()
    maskLayer.path = path.CGPath
    view.layer.mask = maskLayer
    view.layer.masksToBounds = true

【问题讨论】:

我认为您需要发布更多代码,因为您发布的内容本身就是正确的代码。 确保 bounds 对于您要应用圆角半径的视图是正确的 【参考方案1】:

问题是您在为当前设备调整大小之前获取了视图的边界。它比稍后出现在屏幕上时要大,因此圆角矩形的右侧不在屏幕右侧。

您需要稍后创建path 并设置maskLayer.path,在调整视图大小之后,这意味着在运行循环的布局阶段期间或之后。因此,要么将视图子类化并在视图的 layoutSubviews 方法中进行,要么在视图控制器的 viewDidLayoutSubviews 方法中进行。

【讨论】:

谢谢!很长一段时间以来,我一直想知道为什么左角被正确渲染,而右角却不正确。 这真是一个糟糕的错误!【参考方案2】:

斯威夫特 3

它对我有用!

override func layoutSubviews() 
    super.layoutSubviews()
    DispatchQueue.main.async 
       self.containerView.roundCorners(corners: [.topRight,.topLeft], radius: 25)
       self.containerView.layer.masksToBounds = true
    
    self.layoutIfNeeded()

您可以在这里查看“roundCorners”方法:https://***.com/a/41217863/3687902

【讨论】:

这正是 UITableViewCell 的逻辑。非常感谢。我试过的其他方法都没有奏效。【参考方案3】:

如果您尝试为在 Storyboard 或 Xib 上设计的 View 设置 RoundingCorners,请将角和 MaskLayer.path 设置为以下方法。

override func viewDidLayoutSubviews() 
// here you can write the code...
    

【讨论】:

以上是关于UIBezierPath 在右上角和右下角不起作用的主要内容,如果未能解决你的问题,请参考以下文章

UIBezierPath 不起作用

在自定义 UIView 中动画 UIBezierPath 不起作用

设置线帽样式不起作用 UIBezierPath

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

iOS使用UIBezierPath实现ProgressView

UITableViewCell TopLeft 和 BottomLeft 角不起作用