IBInspectable变量值不会在界面生成器和模拟器改变

问题描述 投票:2回答:2

我创建自定义的平行四边形视图,视图渲染罚款默认偏移值。但是,当我从IB改变它的偏移值不工作

@IBDesignable class CustomParallelogramView: UIView {


    @IBInspectable var offset: Float = 10.0

    var path = UIBezierPath()

    lazy var shapeLayer: CAShapeLayer = {
        let layer = CAShapeLayer()
        layer.path = path.cgPath
        return layer
    }()

    override init(frame: CGRect) {
        super.init(frame:frame)
        drawParallelogram()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder:aDecoder)
        drawParallelogram()
    }

    override func prepareForInterfaceBuilder() {
        super.prepareForInterfaceBuilder()
        drawParallelogram()
    }
    override func layoutSubviews() {
        super.layoutSubviews()
        updateFrame()
    }



    func drawParallelogram() {
        print(offset)
        path.move(to: CGPoint(x: bounds.minX + CGFloat(offset), y: bounds.minY))
        path.addLine(to: CGPoint(x: bounds.maxX, y: bounds.minY))
        path.addLine(to: CGPoint(x: bounds.maxX - CGFloat(offset), y: bounds.maxY))
        path.addLine(to: CGPoint(x: bounds.minX, y: bounds.maxY))
        path.close()
        self.layer.mask = shapeLayer

    }

    func updateFrame() {
        shapeLayer.frame = bounds
    }

}

我从IB改变偏移值,但它不会改变IB和模拟器

swift uiview ibinspectable
2个回答
2
投票

一对夫妇的想法:

  1. 正如丹尼尔说,你真的想在你的drawParallelgram观察者调用offset
  2. 此外,在layoutSubviews,您更新了形状图层的frame。要重置其path并再次更新你的面具。
  3. 你只是增加越来越多的招你UIBezierPath。你可能只是想使它成为一个局部变量,避免增加越来越多的笔触到现有路径。
  4. prepareForInterfaceBuilder提出这个方法的目的,一些误解。这不是从IB启动时做初始化。这是做了一些特殊的配置,超出什么是由init方法,通过IB要求已经完成。 例如。如果你有一个复杂的图表视图,让您在程序编程后提供实时图表数据,但是你想看到的东西IB尽管如此,你可能有prepareForInterfaceBuilder填入一些虚拟的数据,例如。但你不应该重复你已经在init方法做了配置。
  5. 这不是与此有关(因为我要建议摆脱这些init方法),但对于它的价值,如果我需要init期间做配置,我一般写两个init方法: override init(frame: CGRect = .zero) { super.init(frame: frame) <#call configure routine here#> } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) <#call configure routine here#> } 请注意,在init(frame:)我公司还供应.zero的默认值。这就确保了,我浑身上下都三种情况: CustomView() CustomView(frame:);要么 如果故事板电话CustomView(decoder:)。 总之,我得到的两个报价三大init方法。大声笑。

所有这一切是说,你可以大大简化这一点:

@IBDesignable public class CustomParallelogramView: UIView {

    @IBInspectable public var offset: CGFloat = 10 { didSet { updateMask() } }

    override public func layoutSubviews() {
        super.layoutSubviews()
        updateMask()
    }

    private func updateMask() {
        let path = UIBezierPath()
        path.move(to: CGPoint(x: bounds.minX + offset, y: bounds.minY))
        path.addLine(to: CGPoint(x: bounds.maxX, y: bounds.minY))
        path.addLine(to: CGPoint(x: bounds.maxX - offset, y: bounds.maxY))
        path.addLine(to: CGPoint(x: bounds.minX, y: bounds.maxY))
        path.close()

        let shapeLayer = CAShapeLayer()
        shapeLayer.path = path.cgPath
        layer.mask = shapeLayer
    }
}

2
投票

尝试:

@IBInspectable var offset: Float = 10.0 {
    didSet {
        drawParallelogram()
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.