gpt4 book ai didi

swift - IBInspectable 变量值在界面生成器和模拟器中没有改变

转载 作者:可可西里 更新时间:2023-11-01 00:38:37 26 4
gpt4 key购买 nike

我正在创建自定义平行四边形 View ,并且 View 使用默认偏移值渲染良好。但是当我从 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 和模拟器

最佳答案

几个想法:

  1. 正如 Daniel 所说,您真的想在您的 offset 观察器中调用 drawParallelgram

  2. 此外,在 layoutSubviews 中,您正在更新形状层的 frame。你想重置它的路径并再次更新你的掩码。

  3. 您只是向 UIBezierPath 添加了越来越多的笔画。您可能只想将其设为局部变量,避免向现有路径添加越来越多的笔画。

  4. prepareForInterfaceBuilder 暗示了对该方法用途的一些误解。这不是为了在从 IB 启动时进行初始化。这是为了进行一些特殊配置,超出 IB 要求的 init 方法已经完成的配置。

    例如如果你有一个复杂的图 TableView ,稍后你将以编程方式提供真实的图表数据,但你想在 IB 中看到一些东西,尽管如此,你可能有 prepareForInterfaceBuilder 填充一些虚拟数据,例如。但是您不应该重复您已经在 init 方法中进行的配置。

  5. 这与此处无关(因为我将建议摆脱这些 init 方法),但对于它的值(value),如果我需要在 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:);或
    • 如果 Storyboard调用 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
}
}

关于swift - IBInspectable 变量值在界面生成器和模拟器中没有改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54510852/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com