我有一个硬编码的应用程序仅支持 1 个方向,纵向。肖像是通过项目设置设置的。
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
在这个视图控制器中有几个视图、按钮、标签和其他标准的 iOS 控件。对于此视图控制器中的所有控件,期望的行为是当用户旋转 iOS 设备时,应用程序中的任何内容都不会旋转。
然而,在所有上述视图之下,作为“背景”的是嵌入在 UIScrollView 中的 UIImageView。这是最底部的视图。在任何时候,用户都可以通过启动照片选择器的按钮来更改此背景。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;
}
}