Вы не можете использовать self
и imageViewHeightConstraint
для инициализации этого свойства, поскольку в данный момент оно не существует.
Самое простое решение - передать ограничение и представление оболочке в представлении init()
метод, подобный этому:
@propertyWrapper
public struct ConstraintValue {
var view: UIView!
var constraint: NSLayoutConstraint!
public var wrappedValue: CGFloat {
set {
constraint.constant = newValue
view.layoutIfNeeded()
}
get {
return constraint.constant
}
}
}
class OurView: UIView {
var imageViewHeightConstraint: NSLayoutConstraint!
@ConstraintValue public var imageHeight:CGFloat
init() {
super.init(size: .zero)
_imageHeight.view = self
_imageHeight.constraint = imageViewHeightConstraint
}
}
В качестве альтернативы вы можете использовать KeyPath для imageViewHeightConstraint
и передать self
оболочке свойств в представлении init()
. Примерно так:
protocol DynamicImageView: UIView {
var imageViewHeightConstraint: NSLayoutConstraint! { get set }
}
@propertyWrapper
public struct ConstraintValue {
var view: DynamicImageView?
private let constraintKeyPath: WritableKeyPath<DynamicImageView, NSLayoutConstraint>
init(constraintKeyPath: WritableKeyPath<DynamicImageView, NSLayoutConstraint>) {
self.constraintKeyPath = constraintKeyPath
}
public var wrappedValue: CGFloat {
set {
view?[keyPath: constraintKeyPath].constant = newValue
view?.layoutIfNeeded()
}
get {
view?[keyPath: constraintKeyPath].constant ?? 0.0
}
}
}
class OurView: UIView, DynamicImageView{
var imageViewHeightConstraint: NSLayoutConstraint!
@ConstraintValue(constraintKeyPath: \.imageViewHeightConstraint)
public var imageHeight:CGFloat
init() {
super.init(frame: .zero)
_imageHeight.view = self
}
}