快速平滑圆角

Posted

技术标签:

【中文标题】快速平滑圆角【英文标题】:smooth rounded corners in swift 【发布时间】:2019-02-17 23:45:37 【问题描述】:

如何创建一个圆角平滑的 UIButton? 标准的苹果圆角比标准的圆角好得多。 如果我在草图中设计一个按钮,我可以切换“平滑角”,它将形状的角从 Apple 圆角(平滑)切换到标准圆角。

这是一个比较:

如何快速切换?

showContentButton.layer.cornerRadius = 20 圆角,但是,我真的不知道这个圆角是“圆角”还是“标准圆角”。而且我不知道如何切换它。有什么想法吗?

【问题讨论】:

【参考方案1】:

iOS 13.0开始,除了设置cornerRadius,你可以只使用这个属性:

sampleButton.layer.cornerCurve = .continuous

这也很容易设置动画,以前使用 UIBezierPath 会导致问题。

在https://developer.apple.com/documentation/quartzcore/calayer/3152596-cornercurve查看更多信息

【讨论】:

【参考方案2】:

iOS 13 之前的版本

要获得这种效果,您可以使用UIBezierPath

编辑: 在 UIView 中的使用

class MyView: UIView 

    let myButton UIButton = UIButton()

    override func layoutSubviews() 
        super.layoutSubviews()

        // your roundPath code here
    


编辑 2:

使用此方法对特定角进行圆角:

let roundPath = UIBezierPath(
    roundedRect: bounds,
    byRoundingCorners: [.topLeft, .topRight],
    cornerRadii: CGSize(width: 10, height: 10)
)

Source

【讨论】:

按钮完全消失了。我做到了:let smoothCornersRoundedPath = UIBezierPath(roundedRect: bounds, cornerRadius: 8) let maskLayer = CAShapeLayer() maskLayer.path = smoothCornersRoundedPath.cgPath showContentButton.layer.mask = maskLayer 你是用layoutSubviews方法做的吗? 按钮只有一个圆角。但它似乎是一个光滑的角落。但所有其他三个角都是尖锐的 (90°) 最后一个问题:如何将拐角半径限制为特定拐角?例如:右上角和右下角应该是圆角,但左上角和左下角应该是锐利的。 @WalterBeiter 谢谢!我已经添加了我的解决方案早于 ios 13 的备忘录。【参考方案3】:

只需使用此扩展程序

extension CALayer 

   func roundCorners(radius: CGFloat) 
       let roundPath = UIBezierPath(
           roundedRect: self.bounds,
           cornerRadius: radius)
       let maskLayer = CAShapeLayer()
       maskLayer.path = roundPath.cgPath
       self.mask = maskLayer
   


并像这样使用它

cell.layer.roundCorners(radius: 18)

【讨论】:

【参考方案4】:

对于 SwiftUI,你可以试试这个:

.clipShape(RoundedRectangle(cornerRadius: 8, style: .continuous))

例子:

Rectangle()
    .clipShape(RoundedRectangle(cornerRadius: 24, style: .continuous))
    .padding()

或使用扩展:

extension View 
    func smoothCornerRadius(_ x: CGFloat) -> some View 
        return self
            .clipShape(RoundedRectangle(cornerRadius: 8, style: .continuous))
    

Result here

【讨论】:

以上是关于快速平滑圆角的主要内容,如果未能解决你的问题,请参考以下文章

RoundRect 的圆角边缘不平滑

圆角视图不平滑

神奇的滤镜!巧妙实现内凹的平滑圆角

平滑圆角 UIView 角,仅底部

如何在 Qt 中的弹出窗口小部件上创建平滑的圆角

如何快速绘制简单的圆角矩形(圆角)