使用Storyboard掩盖UIView并给出圆角?

Cra*_*lot 91 xcode storyboard ios autolayout swift

很多像这样的问题解释了如何以编程方式创建一个蒙版并为UIView提供圆角.

有没有办法在Storyboard中完成所有操作?只是因为看起来像在Storyboard中创建圆角似乎在表示和逻辑之间保持更清晰的界限.

Wor*_*bat 247

是的,我经常使用它,但像这样的问题已经多次回答了.

但无论如何在Interface Builder中.您需要添加如下所示的用户定义的运行时属性:

layer.masksToBounds Boolean YES
layer.cornerRadius Number {View's Width/2}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

并启用

Clips subviews
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

结果:

在此输入图像描述

  • 仅供参考,如果您像我一样来到这里,认为这可以在 LaunchScreen.storyboard 上工作,但事实并非如此。您将收到:“错误:启动屏幕可能无法使用用户定义的运行时属性。” 看起来如果您需要在启动屏幕上显示圆形图像,则您别无选择。 (2认同)

NRi*_*itH 21

您可以使用用户定义的属性在故事板中执行此操作.选择要舍入的视图并打开其Identity Inspector.在" 用户定义的运行时属性"部分中,添加以下两个条目:

  • 关键路径:layer.cornerRadius,类型:数字,值:(您想要的任何半径)
  • 键路径:layer.masksToBounds,类型:布尔值,值:已选中

您可能必须QuartzKit在视图中导入相应的类文件(如果有的话),但我发誓我没有这样做就能让它工作.您的结果可能会有所不

编辑:动态半径的示例

extension UIView {

    /// The ratio (from 0.0 to 1.0, inclusive) of the view's corner radius
    /// to its width. For example, a 50% radius would be specified with
    /// `cornerRadiusRatio = 0.5`.
    @IBDesignable public var cornerRadiusRatio: CGFloat {
        get {
            return layer.cornerRadius / frame.width
        }

        set {
            // Make sure that it's between 0.0 and 1.0. If not, restrict it
            // to that range.
            let normalizedRatio = max(0.0, min(1.0, newValue))
            layer.cornerRadius = frame.width * normalizedRatio
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

我证实这适用于游乐场.

  • 你可以,但只能在代码中.但是,一个有趣的解决方法是在视图的类中添加一个IBInspectable属性,该属性是0到100之间的数值,表示半径应该是宽度的百分比.例如,值50表示半径应为宽度的50%.因为它是一个计算(未存储)属性,您甚至可以将它添加到UIView的扩展中,以便所有视图都可以拥有该属性. (5认同)

小智 12

选择视图 您还使用StoryBord更改了“角落重用”,“边框宽度”和“边框颜色”

extension UIView {

    @IBInspectable var cornerRadiusV: CGFloat {
        get {
            return layer.cornerRadius
        }
        set {
            layer.cornerRadius = newValue
            layer.masksToBounds = newValue > 0
        }
    }

    @IBInspectable var borderWidthV: CGFloat {
        get {
            return layer.borderWidth
        }
        set {
            layer.borderWidth = newValue
        }
    }

    @IBInspectable var borderColorV: UIColor? {
        get {
            return UIColor(cgColor: layer.borderColor!)
        }
        set {
            layer.borderColor = newValue?.cgColor
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么使用cornerRadiusV而不是cornerRadius? (3认同)