Это должно быть довольно распространенным делом, но я не смог заставить его работать точно.
У меня прямоугольный контент. Обычно он умещается в 320x361: портретный режим минус строка состояния минус ad минус панель вкладок.
Я поместил этот контент в UIScrollView и включил масштабирование. Я также хочу, чтобы вращение интерфейса работало. Контент всегда будет высоким прямоугольником, но при увеличении масштаба пользователи могут захотеть видеть больше ширины за раз и меньше высоты.
Что мне нужно сделать в Интерфейсном Разработчике и коде, чтобы сделать это? Как мне установить авторейзинг для разных видов? Как мне установить contentSize и contentInsets?
Я пробовал множество разных способов, и ничего не работает точно. В различных моих решениях у меня были проблемы с некоторыми комбинациями масштабирования, поворота интерфейса и, возможно, прокрутки. Теперь невозможно прокрутить весь контент на экране. Прежде чем вы увидите край содержимого, вы вернетесь к просмотру.
То, как я это делаю сейчас, верно на 80%. То есть из 10 вещей, которые он должен делать, он делает 8 из них. Две вещи, которые он делает неправильно:
При увеличении в портретном режиме вы можете прокрутить границы содержимого и увидеть черный фон. Это не так уж много, чтобы жаловаться. По крайней мере, вы можете увидеть весь контент. В альбомном режиме, увеличенном или уменьшенном, черный фон за краем виден нормально, поскольку контент не имеет достаточной ширины, чтобы заполнить экран при уровне масштабирования 1: 1 (минимум).
Я все еще получаю контент, застрявший на краю, когда он запускается на тестовом устройстве под управлением iOS 3.0, но он работает на моем, работающем под управлением 4.x. - На самом деле это было с предыдущим решением. Мой тестер не пробовал последнее решение.
Вот решение, которое я сейчас использую. Подводя итог, я сделал вид прокрутки настолько широким и высоким, насколько это необходимо для любой ориентации, поскольку я обнаружил, что изменение размера вручную или автоматически добавляет сложность и является хрупким.
Просмотр иерархии:
Представление имеет размер 320x411 и имеет все параметры автоматического изменения размера, поэтому соответствует форме экрана
scrollView имеет значение 480 x 361, начинается с начала координат -80,0, блокируется только сверху и отключает растяжение
scrollableArea - 480 x 361 и фиксируется слева и сверху. Поскольку scrollView отключает растяжение, маски авторазмера для его подпредставлений не имеют значения, но я все равно говорю вам.
содержимое имеет размер 320x361, начинается с начала 80,0 и фиксируется наверху
Я устанавливаю scrollView.contentSize
на 480x361.
shouldAutorotateToInterfaceOrientation
поддерживает все ориентации, кроме портрета вверх ногами.
В didRotateFromInterfaceOrientation я устанавливаю нижнюю вставку содержимого 160, если ориентация горизонтальная, и сбрасываю на 0, если нет. Я устанавливаю левый и правый индикатор вставки по 80 каждый, если ориентация портретная, сбрасываю, если нет.
scrollView.minimumZoomScale = 1.0
scrollView.maximumZoomScale = 2.0
viewForZoomingInScrollView возвращает прокручиваемую область