Проблема изменения размера 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
содержащий ваш UIImageView
s:
@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 вы можете сделать это с помощью инспектора атрибутов для контроллера представления страницы, отменив выбор параметра "Расширить края под верхними панелями".
Это должно предотвратить переход на страницу под строкой состояния. Я думаю, это помогает избежать переключения, которое вы видите.