Я пытаюсь сделать UIScrollView только для масштабирования в горизонтальном направлении. Вид прокрутки настраивается с использованием чистого подхода к автоопределению. Обычный подход, как было предложено в ряде ответов (например, этот) и other. Я успешно использовал это в приложениях до того, как существует автоопределение. Этот подход выглядит следующим образом: в представлении содержимого просмотра прокрутки я переопределяю setTransform()
и изменяю переданный в преобразовании по шкале в направлении x:
override var transform: CGAffineTransform {
get { return super.transform }
set {
var t = newValue
t.d = 1.0
super.transform = t
}
}
Я также reset смещение содержимого прокрутки, чтобы оно не прокручивалось по вертикали во время масштабирования:
func scrollViewDidZoom(scrollView: UIScrollView) {
scrollView.contentSize = CGSize(width: scrollView.contentSize.width, height: scrollView.frame.height)
scrollView.contentOffset = CGPoint(x: scrollView.contentOffset.x, y: 0.0)
}
Это работает очень хорошо, если вы не используете автозапуск:
Однако при использовании автоотключения смещение содержимого в процессе масштабирования оказывается неправильным. Пока просмотр содержимого масштабируется только в горизонтальном направлении, он перемещается вертикально:
Я привел пример проекта в GitHub (используемый для создания видео в этом вопросе). Он содержит две раскадровки, Main.storyboard и NoAutolayout.storyboard, которые идентичны, за исключением того, что Main.storyboard включает автозапуск, а NoAutolayout - нет. Переключайтесь между ними, изменяя настройку проекта основного интерфейса, и вы можете видеть поведение в обоих случаях.
Я бы предпочел не отключать автозапуск, так как он решает ряд проблем с реализацией моего пользовательского интерфейса намного лучше, чем это требуется при ручной компоновке. Есть ли способ сохранить правильное вертикальное смещение содержимого (то есть, ноль) во время масштабирования с автозапуском?
ИЗМЕНИТЬ: Я добавил третий образец раскадровки AutolayoutVariableColumns.storyboard к образцу проекта. Это добавляет текстовое поле для изменения количества столбцов в GridView, что изменяет его собственный размер содержимого. Это более подробно показывает поведение, которое мне нужно в реальном приложении, которое вызвало этот вопрос.