Поверните 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;
}
}