在Interface Builder

时间:2017-12-07 16:05:32

标签: ios uiview interface-builder

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

谢谢!

杰克

更新:这是每个组合的整数值(以圆整为单位):

  • 0:没有圆角
  • 1:左上角
  • 2:右上角
  • 3:左上角&右(两个顶角)
  • 4:左下角
  • 5: top&左下角(左角)
  • 6:右上角&左下角
  • 7:左上角&右边,左下角(除了右下角以外的所有角落)
  • 8:右下角
  • 9:左上角,右下角
  • 10: top&右下角(右角)
  • 11:两个顶角,右下角(除了左下角以外的所有角落)
  • 12:左下角&右(两个底角)
  • 13:左下角&右上,左上角(除了右上角以外的所有角落)
  • 14:左下角&右上角,右上角(左上角除外)
  • 15:所有角落
  • 左上角是1,3,5,7,9,11,13,15
  • 右上角是2-3,6-7,10-11,14-15
  • 左下角是4-7,12-15
  • 右下角是8-15

  • 两个顶角均为3,7,11,15

  • 两个右角都在10-11,14,5
  • 两个底角都在12-15
  • 两个左角都是5,7,13,15

4 个答案:

答案 0 :(得分:3)

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

所以你应该能够在Interface Builder中将layer.maskedCorners的值设置为整数3(或者你需要的任何东西),我不明白为什么这样做会不安全。虽然如果忘记了,整数值实际映射到哪个角集将会很痛苦。

答案 1 :(得分:1)

没有检查它是否有效,但是您可以尝试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 

答案 2 :(得分:1)

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

请记住,默认设置为 On / true(以便“cornerRadius”影响视图的所有角落)。如果您想对除一个角以外的所有角进行圆角处理,只需将该特定角设置为 false

enter image description here

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)
            }
        }
    }
}

答案 3 :(得分:0)

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

enter image description here