gpt4 book ai didi

ios - UIView 初始化覆盖导致 IBDesignable 崩溃

转载 作者:搜寻专家 更新时间:2023-10-31 22:48:11 24 4
gpt4 key购买 nike

我在使用 XCode 7.1 界面生成器时遇到了一个非常奇怪的问题。我有一个非常简单的 UIView 子类,它在 Storyboard编辑器中呈现良好:

import UIKit

@IBDesignable
class DashboardHeaderView: UIView {

@IBInspectable
var maskClipHeight: CGFloat = 40.0

override func layoutSubviews() {
super.layoutSubviews()
self.setMask()
}

private func setMask() {
let mask = CAShapeLayer()
mask.path = self.createMaskPath()
self.layer.mask = mask
}

private func createMaskPath() -> CGPath {
let maskPath = UIBezierPath()
maskPath.moveToPoint(CGPoint(x: bounds.minX, y: bounds.minY))
maskPath.addLineToPoint(CGPoint(x: bounds.maxX, y: bounds.minY))
maskPath.addLineToPoint(CGPoint(x: bounds.maxX, y: bounds.maxY - self.maskClipHeight))
maskPath.addLineToPoint(CGPoint(x: bounds.minX, y: bounds.maxY))
maskPath.closePath()

return maskPath.CGPath
}

}

但是,如果我只向它添加初始化程序覆盖:

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

它因错误而失败:

  • 错误:IB Designables:无法更新自动布局状态:代理崩溃
  • 错误:IB Designables:无法呈现 DashboardHeaderView 实例:代理崩溃

我 100% 肯定初始化程序覆盖会导致它崩溃,因为我已经重现了几次。如果我只是将其注释掉,它会再次起作用。

任何人都知道为什么会发生这种情况,是否有办法解决/解决它?

最佳答案

我整天都在为这个问题苦苦挣扎。您需要实现:

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

这是 IBDesignable 代理用来实例化类的初始化程序。所以,就我而言,我还有另一个初始化程序。

init(frame: CGRect, maxValue: Double, minValue: Double) {
super.init(frame: frame)

self.maxValue = maxValue
self.minValue = minValue
}

我的初始化阻止了 IBDesignable 需要的初始化。一旦我覆盖了上面的默认 init,我就可以选择保留我的 init 或将其转换为方便的 init:

convenience init(frame: CGRect, maxValue: Double, minValue: Double) {
self.init(frame: frame)

self.maxValue = maxValue
self.minValue = minValue
}

现在我可以为 IBDesigner 添加一些默认行为:

var initForIB = false

init(frame: CGRect, maxValue: Double, minValue: Double) {
super.init(frame: frame)

self.maxValue = maxValue
self.minValue = minValue
initForIB = false
}

override init(frame: CGRect) {
super.init(frame: frame)
initForIB = true
}

required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

override func drawRect(rect: CGRect) {
if initForIB {
initIBDefaults()
}
// ...do some other stuff...
}

关于ios - UIView 初始化覆盖导致 IBDesignable 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33569528/

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