Поверните UIImageView в приложении iOS, которое не поддерживает вращение

У меня есть приложение, которое жестко запрограммировано для поддержки только 1 ориентации, портрет. Портрет устанавливается через настройки проекта.

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{   
      return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

В этом контроллере вида есть несколько видов, кнопок, меток и других стандартных элементов управления iOS. Для всех элементов управления в этом контроллере представления желаемое поведение состоит в том, что, когда пользователь поворачивает устройство iOS, ничего внутри приложения не вращается.

Тем не менее, под всеми вышеупомянутыми представлениями, выступающими в качестве "фона", находится UIImageView, встроенный в UIScrollView. Это самый нижний вид. В любое время пользователь может изменить этот фон с помощью кнопки, которая запускает средство выбора фотографий. UIImageView встроен в UIScrollView, потому что желаемое поведение состоит в том, чтобы разрешить масштабирование на фоновом изображении.

Хотя приложение не поддерживает ротацию, я бы хотел, чтобы содержимое ImageView всегда было правильно ориентировано при загрузке.

Например, учитывая, что единственной поддерживаемой ориентацией является UIInterfaceOrientationPortrait, пользователь запускает приложение, поворачивает устройство iOS в положение LandScape. В портретном режиме пользователь выбирает новое фоновое изображение. Предполагаемое поведение будет для выбранного изображения, чтобы быть ориентированным и аспектным правильным на основе текущей ориентации.

По сути, я ищу это фоновое изображение, чтобы всегда иметь "Гравитацию" к земле при выборе. Если после того, как пользователь выберет новое изображение, он поворачивает устройство iOS, фоновое изображение не поворачивается. Только при первоначальном выборе изображения оно будет правильно ориентировано.

Я могу повернуть изображение с помощью CGAffineTransformMakeRotation, однако увеличение с помощью пинч-функции демонстрирует нежелательное поведение, так как пиксели внутри самого изображения на самом деле не меняют ориентацию.

Я думаю, что мне может понадобиться создать новое изображение, когда пользователь выбирает изображение, что-то вроде...

UIImage * RightLandscapeImage = [[UIImage alloc] initWithCGImage: userSelectedImage.CGImage
                                                         scale: 1.0
                                                   orientation: UIImageOrientationRight];

Я не вижу простого решения этой проблемы. Возможно я пропускаю что-то легкое?

СЛЕДУЙТЕ за этим кодом, который, кажется, требуется. С учетом текущей ориентации и ориентации запуска.

UIImage * newImage;
if( startUpOrientation == UIInterfaceOrientationLandscapeRight )
{
    switch (currentOrientation) {
        case UIInterfaceOrientationLandscapeLeft:
          newImage = [[UIImage alloc] initWithCGImage: bgImage.CGImage
                                                                 scale: 1.0
                                                           orientation: UIImageOrientationDownMirrored];

             [self.backgroundImageView setImage:newImage];
            break;
        case UIInterfaceOrientationLandscapeRight:
             [self.backgroundImageView setImage:bgImage];
            break;
        case UIInterfaceOrientationPortraitUpsideDown:
            newImage = [[UIImage alloc] initWithCGImage: bgImage.CGImage
                                                  scale: 1.0
                                            orientation: UIImageOrientationRight];

            [self.backgroundImageView setImage:newImage];

            break;
        default:
            newImage = [[UIImage alloc] initWithCGImage: bgImage.CGImage
                                                  scale: 1.0
                                            orientation: UIImageOrientationLeft];
            [self.backgroundImageView setImage:newImage];
            break;
    }
 }

1 ответ

Вы можете применить преобразование к любому представлению, которое вы хотите повернуть, в willRotateToInterfaceOrientation

Вы можете попробовать этот код:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
    {
        switch (toInterfaceOrientation) {
            case UIInterfaceOrientationLandscapeLeft:
                yourview.transform = CGAffineTransformMakeRotation(M_PI_2); // 90 degress
                break;
            case UIInterfaceOrientationLandscapeRight:
                yourview.transform = CGAffineTransformMakeRotation(M_PI + M_PI_2); // 270 degrees
                break;
            case UIInterfaceOrientationPortraitUpsideDown:
                yourview.transform = CGAffineTransformMakeRotation(M_PI); // 180 degrees
                break;
            default:
                yourview.transform = CGAffineTransformMakeRotation(0.0);
                break;
        }
    }
Другие вопросы по тегам