Я пытаюсь понять, как правильно использовать NSCoder
когда подклассы UIView
:Возможно ли получить доступ к свойствам UIView (например, кадр) в init (coder :)?
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
мне интересно, можно ли получить доступ всех свойств, которые aDecoder
могут нести. Я бы, например, ожидайте, что он будет знать размер frame
, который имеет вид в Раскадровки. Можно ли получить доступ к этой информации? Я попытался следующие, но она возвращается только 0-значения для CGRect
:
required init?(coder aDecoder: NSCoder) {
let frame = aDecoder.decodeCGRect(forKey: "frame")
print(frame) // prints: (0.0, 0.0, 0.0, 0.0)
super.init(coder: aDecoder)
}
Я проверил documentation из UIView
, но нет информации об этом.
Это, вероятно, изменится в первом макете. Если вы используете ограничения, кадр не будет в кодере. Зачем вам нужно знать? Что вы пытаетесь достичь? Вероятно, есть другой способ сделать это. –
просто попробовал его после 'super.init()', но он все еще печатает только: '(0.0, 0.0, 0.0, 0.0)'. не следует ли «aDecoder» нести основную информацию о настройке представления в раскадровки? например 'frame' или' backgroundColor', чтобы его можно было использовать в инициализаторе 'UIView'? – nburk
В 99% случаев рамка объекта в раскадровке будет задана ограничениями, а не рамками, указанными в раскадровке. 'backgroundColor' отличается; это свойство, которое обычно устанавливается явно в раскадровке и должно быть доступно после вызова 'super.init'. Обычно ваш подкласс будет определять через 'intrinsicContentSize' размер, который он хочет – Paulw11