在 Interface Builder 中设置蒙版角

Setting masked corners in Interface Builder

[.layerMaxXMinYCorner, .layerMinXMinYCorner] 是什么类型的值?是否可以在 Interface Builder 的视图上设置此参数?我知道如何在 Identity Inspector 中设置 layer.borderWidthlayer.borderUIColorlayer.cornerRadius,但我无法找出用于蒙版角的正确类型和值。

谢谢!

杰克


更新:这里是每个组合的整数值(四舍五入):


maskedCorners 是一个 CACornerMask,它是一个 OptionSet,或位掩码。原始值是一个整数:在代码中,您可以尝试打印 someView.layer.maskedCorners.rawValue 的值,或者通过 someView.layer.maskedCorners.setValue(3, forKey: "maskedCorners").

设置它

因此您应该能够在 Interface Builder 中将 layer.maskedCorners 的值设置为整数 3(或您需要的任何值),我不明白为什么这样做会不安全。如果您忘记了,弄清楚整数值实际映射到哪一组角点会很痛苦。

没有检查它是否有效,但你可以尝试 c:

(不要忘记将蒙版应用于您的视图)

@IBDesignable
class ViewController: UIViewController {
    // Preprocessor macro, you won't be able 
    // to use code inside this "if" statement from your... code
    // Just use cornerMask property directly
    #if TARGET_INTERFACE_BUILDER
    @IBInspectable
    var topLeft: Bool = false {
        didSet {
            updateCornerMask()
        }
    }

    @IBInspectable
    var topRight: Bool = false {
        didSet {
            updateCornerMask()
        }
    }

    @IBInspectable
    var bottomLeft: Bool = false {
        didSet {
            updateCornerMask()
        }
    }

    @IBInspectable
    var bottomRight: Bool = false {
        didSet {
            updateCornerMask()
        }
    }

    func updateCornerMask() {
        cornerMask = CACornerMask(
            TL: topLeft,
            TR: topRight,
            BL: bottomLeft,
            BR: bottomRight)
    }
    #endif

    var cornerMask: CACornerMask?
}

extension CACornerMask {
    init(TL: Bool = false, TR: Bool = false, BL: Bool = false, BR: Bool = false) {
        var value: UInt = 0
        if TL { value += 1 }
        if TR { value += 2 }
        if BL { value += 4 }
        if BR { value += 8 }

        self.init(rawValue: value)
    }
}

// And yeah maybe using UIView makes more sense 

我只是随机遇到了同样的“问题”并编写了另一个解决方案,在 IB 中为每个角落使用扩展(无子类)和视觉切换(无需手动设置/添加位标志)。

请记住,默认设置为开/true(以便“cornerRadius”影响视图的所有角)。如果你想把除一个角以外的所有角都圆化,只需将那个特定的角设置为 false.

import UIKit

@IBDesignable
public extension UIView {
    @IBInspectable var cornerRadius: CGFloat {
        get { return layer.cornerRadius }
        set { layer.cornerRadius = newValue }
    }

    @IBInspectable var topLeft: Bool {
        get { return layer.maskedCorners.contains(.layerMinXMinYCorner) }
        set {
            if newValue {
                layer.maskedCorners.insert(.layerMinXMinYCorner)
            } else {
                layer.maskedCorners.remove(.layerMinXMinYCorner)
            }
        }
    }

    @IBInspectable var topRight: Bool {
        get { return layer.maskedCorners.contains(.layerMaxXMinYCorner) }
        set {
            if newValue {
                layer.maskedCorners.insert(.layerMaxXMinYCorner)
            } else {
                layer.maskedCorners.remove(.layerMaxXMinYCorner)
            }
        }
    }

    @IBInspectable var bottomLeft: Bool {
        get { return layer.maskedCorners.contains(.layerMinXMaxYCorner) }
        set {
            if newValue {
                layer.maskedCorners.insert(.layerMinXMaxYCorner)
            } else {
                layer.maskedCorners.remove(.layerMinXMaxYCorner)
            }
        }
    }

    @IBInspectable var bottomRight: Bool {
        get { return layer.maskedCorners.contains(.layerMaxXMaxYCorner) }
        set {
            if newValue {
                layer.maskedCorners.insert(.layerMaxXMaxYCorner)
            } else {
                layer.maskedCorners.remove(.layerMaxXMaxYCorner)
            }
        }
    }
}

在界面构建器中,我通过在 运行 时间选择要转换的对象来设置这些,在用户定义的 运行time 属性中,KeyPath 是 layer.cornerRadiuslayer.maskedCorners 类型为 Number 并添加要更改的角的原始值。