Проблема изменения размера UIImageView в UIPageViewController

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

Вот видео проблемы: http://youtu.be/dXcjjT-8Bk0

Я перепробовал все разные режимы просмотра (Аспектная подгонка, Аспектная заливка, Перерисовка и т. Д.), И все они ведут себя одинаково.

Я использую классы 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 что дает мне правильное изображение (после того, как они сделали свое "изменение размеров".

Кто-нибудь может направить меня дальше, как это исправить?

3 ответа

Решение

Из вашего видео я заметил, что ваш UIImageView всегда "изменен" вверху, а не внизу. Это, скорее всего, связано с ограничением автопоставки, которое вы называете "Руководство по макету сверху вниз". В то время как ваш UIImageViewконтроллер представления передается через ваш прокручиваемый контроллер просмотра страниц, он не знает, где находится верхнее руководство по макету, поэтому его topLayoutGuide.length является 0, Только после завершения анимации контроллер представления получает положительное значение для topLayoutGuide.length, Да, контроллер просмотра страниц должен быть немного умнее, но это не так.
Вы можете либо прекратить использовать верхнее руководство по макету, и установить ограничение на автоматическое расположение относительно вершины его суперпредставления. Или вы можете продолжать использовать верхнее руководство по макету, но учтите, когда это length является 0, Вы можете сделать это, сделав розетку для вашей раскадровки NSLayoutConstraint и переопределение viewWillLayoutSubviews() в вашем ViewController содержащий ваш UIImageViews:

@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, Даже лучше, чем жесткое кодирование, это значение передавать точную длину родительского контроллера во время инициализации, учитывая любые возможные изменения в верхнем руководстве по макету, такие как добавление панели навигации.

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

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

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

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

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

Другие вопросы по тегам