Ответ 1
Из вашего видео я заметил, что ваш UIImageView
всегда "изменен" сверху, а не внизу. Это, безусловно, связано с вашим ограничением автоопределения, которое вы называете "Top Space to Top Layout Guide". Пока ваш контроллер просмотра 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
. Даже лучше, чем hardcoding, значение заключается в том, чтобы передавать в родительском представлении точную длину контроллера во время инициализации, учитывая любые возможные изменения в руководстве по началу работы, например, добавление навигационной панели.