IBDesignable呈现NSLayoutConstraint子类

时间:2017-01-29 17:09:28

标签: ios autolayout nslayoutconstraint ibdesignable ibinspectable

我开发了DeviceLayout资料库enter link description here

enter image description here

此库提供DeviceLayoutConstraint以设置每个设备大小的AutoLayout常量

import UIKit

import Device
class DeviceLayoutConstraint: NSLayoutConstraint {

    @IBInspectable var inch3_5: CGFloat = 0.0 { didSet { updateConstant(size: .screen3_5Inch, constant: inch3_5)}}
    @IBInspectable var inch4: CGFloat = 0.0 { didSet { updateConstant(size: .screen4Inch, constant: inch4)}}
    @IBInspectable var inch4_7: CGFloat = 0.0 { didSet { updateConstant(size: .screen4_7Inch, constant: inch4_7)}}
    @IBInspectable var inch5_5: CGFloat = 0.0 { didSet { updateConstant(size: .screen5_5Inch, constant: inch5_5)}}
    @IBInspectable var inch7_9: CGFloat = 0.0 { didSet { updateConstant(size: .screen7_9Inch, constant: inch7_9)}}
    @IBInspectable var inch9_7: CGFloat = 0.0 { didSet { updateConstant(size: .screen9_7Inch, constant: inch9_7)}}
    @IBInspectable var inch12_9: CGFloat = 0.0 { didSet { updateConstant(size: .screen12_9Inch, constant: inch12_9)}}

    fileprivate func updateConstant(size: Size, constant: CGFloat) {
        if size == deviceSize() {
            self.constant = constant
            layoutIfNeeded()
        }
    }

    open func deviceSize() -> Size {
        return Device.deviceSize
    }

    open func layoutIfNeeded() {
        self.firstItem.layoutIfNeeded()
        self.secondItem?.layoutIfNeeded()
    }
}

fileprivate extension Device {
    static let deviceSize = Device.size()
}

在运行时模拟器或设备中应用的每个设备常量属性

我的问题是

选择设备时,是否可以使用IBInspectable或IBDesignable进行更新渲染?

我想在设备类型更改时检查Storyboard或Xib文件中的渲染

enter image description here

1 个答案:

答案 0 :(得分:1)

是的,约束(无论是您的子类还是标准约束)与可设计视图完全兼容。显然,它要求您的@IBDesignable视图正确处理大小变化,但我们通常会这样做。

例如,如果您有一个可设计的视图添加了一个圆形的CAShapeLayer,那么您只需在适当的CAShapeLayer方法中添加init一次,但只更新一次path方法中的图层layoutSubviews。例如,请参阅CircleView

但是,如果您正确处理大小布局更改,您也会自动适当地处理约束。