2015-05-12 1 views
1

Я искал эту информацию и не могу точно определить ответ на вопрос, который у меня есть.Автоматически устанавливать вертикальный размер UIView на основе вертикального размера устройства (включая изменения автоматического макета)

Я пишу приложение и хотел бы, чтобы вертикальное пространство дочернего UIView поддерживало высоту устройства или вращение родительского устройства независимо от ориентации и без жесткого кодирования значений раньше времени.

Структура моего макета:

ViewContainer 
    UIView 
    UIScrollView 
     UIView (Content View) 

В частности, я хотел бы иметь вертикальное пространство содержимого View изначально быть установлен родной высота устройства/ориентации, что в настоящее время она работает на, и когда устройство вращается, я хотел бы, чтобы вертикальное пространство изменилось на новую вертикальную высоту. UIScrollView будет использоваться для панорамирования только по горизонтали.

Я буду использовать кварц для рисования на вид. Установить начальную высоту через intrinsicContentSize? Если да, то как мне выполнить запрос родительского представления?

Я попытался использовать self.superview в представлении контента, но это не работает. Как узнать, что произошло изменение, и после того, как это произошло, как мне получить новое разрешение Y, а затем применить его? Также я не хочу отключать автоматический макет, если мне это не нужно.

Вот визуальное того, что я хочу, если я не ясно дал понять: https://www.evernote.com/l/AAI3VFkKBARPlYPsoURJOwAmIiGielF5p-w

+0

Я бы использовал размер 'UIScreen.mainScreen(). Bounds.size.height' (или ширина, если вы в ландшафте). Затем используйте макрос 'UIDeviceOrientationIsLandscape()'. Это еще несколько других. Посмотрите на них. –

+0

Я пробовал модифицировать код Pure AutoLayout в TN2154, но я не могу обнаружить изменения (и не уверен, что это правильный способ атаковать проблему в первую очередь). Я могу форсировать размер через intrinsicContentSize, но не уверен, как правильно определить размер или когда происходит поворот. Я смотрел на viewWillTransitionToSize, но не уверен, что это правильный подход. – Tornado

+0

Чтобы получать уведомления об изменениях ориентации, вы можете подписаться на уведомления. Не уверен, что это подходит для вашего прецедента, но вот фрагмент «[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector (orientationChanged :) name: UIDeviceOrientationDidChangeNotification object: nil];' Тогда просто убедитесь, что у вас есть метод под названием 'orientationChanged 'который принимает параметр' NSNotification' –

ответ

0

У меня есть приложение с одной и той же иерархией представлений.

Что вы хотите достичь с помощью чистого AutoLayout со следующими ограничениями. Только вертикальные ограничения включены здесь:

view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[scrollView]|", options: .allZeros, metrics: nil, views: ["scrollView" : scrollView])) 

scrollView.addConstraint(NSLayoutConstraint(item: contentView, attribute: .Height, relatedBy: .Equal, toItem: scrollView, attribute: .Height, multiplier: 1.0, constant: 0.0)) 
scrollView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[contentView]|", options: .allZeros, metrics: nil, views: ["contentView" : contentView])) 

Поскольку высота contentView всегда правильно, не уверен, что по-прежнему ли вы хотите получать уведомления об изменении ориентации.

+0

Фантастический! Это сработало. Я хотел получить чистое решение AutoLayout, и это сделало трюк! Спасибо! – Tornado

+0

Вы примете это в качестве ответа? –

+0

Да. Извините, это был мой первый вопрос, который я задал здесь, поэтому я немного нубиш на этом фронте. Мне просто нужно проверить зеленую галочку? – Tornado

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