2016-10-10 2 views
0

Я пытаюсь понять, как правильно использовать 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, но нет информации об этом.

+0

Это, вероятно, изменится в первом макете. Если вы используете ограничения, кадр не будет в кодере. Зачем вам нужно знать? Что вы пытаетесь достичь? Вероятно, есть другой способ сделать это. –

+0

просто попробовал его после 'super.init()', но он все еще печатает только: '(0.0, 0.0, 0.0, 0.0)'. не следует ли «aDecoder» нести основную информацию о настройке представления в раскадровки? например 'frame' или' backgroundColor', чтобы его можно было использовать в инициализаторе 'UIView'? – nburk

+0

В 99% случаев рамка объекта в раскадровке будет задана ограничениями, а не рамками, указанными в раскадровке. 'backgroundColor' отличается; это свойство, которое обычно устанавливается явно в раскадровке и должно быть доступно после вызова 'super.init'. Обычно ваш подкласс будет определять через 'intrinsicContentSize' размер, который он хочет – Paulw11

ответ

-1

Если вам нужны реальные размеры пользовательского ракурса, то вам следует обратить внимание на метод представление-контроллер ваш взгляд в:

-(void) viewDidLayoutSubviews 

Ваш пользовательский вид должен иметь это правильные размеры устанавливаются, когда это вызывается.

Смежные вопросы