2013-03-06 4 views
1

Я использую UIScrollView с несколькими UIScrollViews как subview, каждый из которых содержит UIImageView для отображения изображения.
Само приложение поддерживает ориентацию только портретной ориентации, но я хочу, чтобы изображения отображались во время вращения устройства (наблюдая за UIDeviceOrientationDidChangeNotification).
Вращение изображений выполняется с анимированным setTransform: с использованием как CGAffineTransformScale, так и CGAffineTransformMakeRotation.
Масштабирование изображений осуществляется путем возврата изображения с viewForZoomingInScrollView: для прокрутки, содержащей изображение.UIScrollView, содержащий повернутый UIImageView, не будет увеличивать

Это все работает отлично, за исключением одного: когда изображение поворачивается, я больше не могу увеличить. Отладка показывает viewForZoomingInScrollView:, но scrollViewDidZoom: нет.

Кто-нибудь имеет представление о том, что может вызвать эту проблему?

+0

Но вы можете увеличивать масштаб, когда он находится на портрете? Если вы поворачиваете в альбомный пейзаж, а затем возвращаетесь к портрету, можете ли вы снова увеличить масштаб? – mbuc91

+0

Да, я могу масштабировать, когда на портрете, и да, я могу увеличить масштаб при возвращении к portait. –

ответ

7

Исправлено, применяя преобразования к UIScrollView (содержащему UIImageView), вместо самого UIImageView.

Просто применение преобразований в UIScrollView не получилось достаточно хорошо. Он поместил бы повернутое изображение в меньший вид, а масштабирование не использовало доступное пространство экрана.

Наконец-то мне удалось исправить это, так вот вот как.

Требования

  • Горизонтально прокрутки списка полноэкранных изображений
  • Поворот устройства должны не вращать приложение, но MUST повернуть показанное изображение
  • Должно быть в состоянии для увеличения изображения, как при удержании устройства в портретной и альбомной ориентации

Как я реализовал это

Одна из основных UIScrollView с высотой, равной высоте экрана, а ширина равна ширине экрана * количеству изображений. Пейджинг включен.
Этот основной UIScrollView содержит подзаголовок для каждого изображения. Каждый подтаблица выглядит следующим образом:
UIScrollView> UIView> UIImageView

UIScrollView имеет размер экрана, а его origin.x свойство равно 0 для первой подтаблицы, и увеличения с шириной экрана для каждого последующего UIScrollView. Результат является главным UIScrollView, со всем субом UIScrollViews рядом с Афоризм, как это (без пробелов):

┌────────────────────┐ 
│┌───┐┌───┐┌───┐┌───┐│ 
││ 1 ││ 2 ││ 3 ││ 4 ││ 
││ ││ ││ ││ ││ 
│└───┘└───┘└───┘└───┘│ 
└────────────────────┘ 

Чтобы устранить проблему вращения, то UIImageView больше не является прямыми подтаблицами от UIScrollView, но теперь встроенный внутри контейнера UIView.
Метод основного делегата UIScrollView теперь возвращает контейнер UIView для видимого изображения, поэтому этот контейнер UIView будет использоваться для масштабирования. Вращение просмотров изображений по-прежнему выполняется с анимированным setTransform: с использованием как CGAffineTransformScale, так и CGAffineTransformMakeRotation.

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

+1

Прекрасное решение, с которым я столкнулся с той же проблемой, пришел к тому же выводу, что преобразование, уже примененное к UIImageView для вращения, не будет хорошо сочетаться с масштабом. Ваше решение сработало хорошо, хотя есть небольшая проблема отсечения, потому что UIView не знает эффективных границ UIImageView, которые будут вращаться внутри него, поэтому это не увеличит размер содержимого в прокрутке. Полагаю, мне придется рассчитывать и вручную увеличивать размер содержимого scrollView. –

+1

Спасибо за это - у меня была аналогичная проблема, но это сложная задача для Google: –