2015-01-06 3 views
15

Я создаю новое приложение и хочу начать «приветственное пошаговое руководство» в начале, когда у меня есть раскадровка с серией изображений, представленных в UIPageViewController. Я загружаю изображения и все это прекрасно, однако изображения изменяются каждый раз, когда они выходят за рамки «предыдущего» или «следующего» ViewController. Я использую Swift для разработки.Проблема с изменением размера UIImageView в UIPageViewController

Вот видео выпуска: http://youtu.be/dXcjjT-8Bk0

Я попытался все различные режимы просмотра (Aspect нужным, аспект заполнения, перерисовать и т.д.), и все они ведут себя так же.

Я использую классы Auto-Layout + Size, поскольку я хочу упростить разработку для разных размеров экрана. Существующие ограничения у меня есть, которые делают UIImage появляются в нужный размер, являются:

Align Centre X to Superview 
Top Space to Top Layout Guide 
Bottom Space to Bottom Layout Guide + Equals: 50 

настоящее время я использую Aspect Fit который дает мне верное изображение (после того, как они сделали свое «поведение при изменении размера»

Can. все направляют меня дальше о том, как это исправить?

ответ

14

Из вашего видео я заметил, что ваш UIImageView всегда «изменен» сверху, а не внизу. Это, безусловно, из-за вашего ограничения автоопределения, которое вы называете " Top Space to Top Layout Guide ". Пока вы видите UIImageView контроллер переходит через ваш контроллер просмотра страницы прокрутки, он не знает, где находится верхняя направляющая макета, поэтому ее topLayoutGuide.length - 0. Только после завершения анимации контроллер вида получает положительное значение для topLayoutGuide.length. Да, контроллер просмотра страницы должен быть немного умнее этого, но это не так.
Вы можете либо прекратить использование верхнего руководства по макете, либо сделать ограничение автоопределения относительно вершины своего супервизора. Или вы можете продолжать использовать верхний макет руководства, но учетная запись, когда он length, является 0. Вы можете сделать это, сделав выход для раскадровки-х NSLayoutConstraint и наиважнейшей viewWillLayoutSubviews() в ваших ViewController, содержащих ваши UIImageView с:

@IBOutlet weak var topSpaceToTLG: NSLayoutConstraint! 
var parentTLGlength: CGFloat = 20 

override func viewWillLayoutSubviews() { 
    if self.topLayoutGuide.length == 0 { 
     // Lengthen the autolayout constraint to where we know the 
     // top layout guide will be when the transition completes 
     topSpaceToTLG.constant = parentTLGlength 
    } else { 
     topSpaceToTLG.constant = 0 
    } 
} 

Это всегда будет положить в верхней части вашего UIImageView на верхней направляющей разметки, при условии, что в строке состояния всегда 20 баллов. Перед тем, как выложить подзаголовки, он проверяет, соответствует ли верхняя длина направляющей макета 0 или нет, и соответственно корректирует ограничение автоопределения. После завершения анимации перехода макет запускается снова, а верхняя длина направляющей макета будет ожидаемой, поэтому константа ограничения может вернуться к 0. Даже лучше, чем hardcoding, это значение, которое нужно передать в точную длину контроллера родительского представления во время инициализации, учитывая любые возможные изменения в руководстве по верху, как добавление навигационной панели.

+1

У кого-нибудь еще есть эта проблема? Это не сработало для меня. У меня есть полный экран imageView в фоновом режиме, и он все еще делает это. –

+0

Это, к сожалению, не учитывает поворот: в ландшафте на телефоне длина верхнего руководства макета _properly_ 0. Поиск длины направляющей родительского VC, по-видимому, является единственным решением, как бы то ни было. –

1

Из видео, которое, я думаю, вы могли бы решить это, предотвратив расширение UIPageViewController под верхними барами.

В xcode вы можете сделать это, используя инспектор атрибутов для контроллера просмотра страницы, сняв флажок «Расширять края в верхних барах».

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

+0

Я пробовал это сам, но это не сработало. – jason328

1

Я выяснил, что моя проблема заключалась в том, что когда диспетчер представлений начал анимировать верхние и нижние макеты, гиды не имели высоты. Правый и левый поля тоже не были. Когда представление закончило анимацию, все они получили высоту или ширину, и мой вид изменил размер. Я исправил эту проблему в своем проекте, добавив вертикальные ограничения между моими объектами и их супер-представлением, а не в Руководство по макету Top/Bottom. Я также должен был изменить свои горизонтальные ограничения, чтобы игнорировать боковые поля.

Последняя проблема, с которой я столкнулся, заключается в том, что я должен был сам следить за статусом. Это может быть или не быть там, или это может быть двойной бар, например, когда вы используете Карты.

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