如何在一个视图不应该自动旋转而一个视图应该自动旋转的 iOS 应用程序中处理自动旋转?
Posted
技术标签:
【中文标题】如何在一个视图不应该自动旋转而一个视图应该自动旋转的 iOS 应用程序中处理自动旋转?【英文标题】:How to handle auto rotation in an iOS app where one view should not be auto rotated and one view should? 【发布时间】:2012-05-27 20:31:32 【问题描述】:比如说,如果是 iPad 上的一个简单的绘图程序,当用户在纵向模式下从 (0,0) 到 (730, 1000) 绘制一条线时,这条线会完整显示。但是如果用户将 iPad 旋转 90 度,如果我们允许自动旋转,那么底部的线会被切断。
因此包含画布的视图不应自动旋转。
另一方面,如果屏幕上有一个撤消按钮,或者一个滑出面板,那么这部分实际上应该根据iPad的旋转状态自动旋转。
如何最好地实施?因为通常我们对所有东西都有自动旋转,或者根本没有自动旋转,但这种情况需要一半一半。
【问题讨论】:
好吧,如果你设置了正确的自动调整大小的蒙版,那么当你旋转它时,线条会正确缩放.... @lnafziger 缩放会影响纵横比吗?比如说,如果用户画了一个圆......不希望圆在旋转后变成椭圆 是的,它会影响宽高比。就个人而言,我宁愿看到具有视觉可感知绘图区域和不同背景区域的画布,并且仍然能够旋转我的 iPad。因此,在一个视图中,您基本上会有一个信箱效果,顶部和底部的条形无法绘制。不过,这将保持相同的纵横比。 @lnafziger 所以你的意思是只能在 768 x 768 区域中绘制? (如果允许状态栏,则为 748 x 748) 这只是一个建议。当我启动一个应用程序并且必须转动我的 iPad 才能使用它时,我个人讨厌它。我宁愿让它以任何方式发挥作用,尽管在另一个方向上可能“更好”。如果我在应用程序之间切换,尽管某些方向不受支持,但它会变得非常烦人!根据您的应用程序,其余空间可以是侧面或顶部的工具栏,具体取决于它面向的方向。无论如何,只要我的 2 美分。 【参考方案1】:我必须同意 lnafziger 的观点,我很难想象用户在旋转设备时会希望他们的绘图不旋转。绘图时,图像的上下和左右方面对于创意绘图过程是如此不可或缺,以至于我会认为看到视图上的控件旋转,但图像没有旋转会很奇怪。底线,我认为即使用户旋转设备,您也确实希望保留图像的上下和左右。但我认为你是绝对正确的,如果用户在旋转设备时图像的纵横比发生变化(即,如果你压扁了图像),用户会发现它会迷失方向。
现在,您已经提到了一种防止纵横比受到干扰的解决方案,即保持绘图图像为正方形,例如 768x768,并且可能使用额外的空间来布置一些控件/工具。更好的是,您可能想要引入由用户可以在其上平移/滚动的页面组成的绘图的概念。这样,您可以将图像设置为用户想要的任何大小,并且当用户旋转设备时,图像的“页面”不会改变,只是 iPad 屏幕所代表的那个页面上的小视口。如果你确信用户想要旋转图像,那么就给他们一个旋转页面的功能,不管设备方向如何。您可以轻松地将他们想要的所有东西的坐标映射到新空间中。这种映射应该很容易。
但是,如果您决定在他们旋转设备时不旋转图像(尽管我们坚持认为这似乎不是一个好主意),似乎有两种方法(假设您不会考虑最简单的解决方案,即在应用程序中只允许一个方向):
首先,您可以重新映射用户绘制的对象的所有坐标,然后在旋转完成后重新绘制对象。同样,当您旋转 90 度时,所有 x,y 坐标的重新映射非常简单。
其次,您可以将绘图放在它自己的图层上,然后在设备旋转时执行CGAffineTransformRotate(例如,如果用户将设备旋转 90 度或 PI/2 弧度,顺时针,您将旋转层 PI/2 逆时针)。令我震惊的是,当您在转换后绘制新线或其他对象时,这可能会让人感到困惑,因为您可能必须将新坐标映射到转换后的图层,但我怀疑您可以让它工作。有关更多信息,请参阅 CGAffineTransformRotate 的文档。如果你用谷歌搜索,那里有很多例子。
【讨论】:
【参考方案2】:我同意你的观点,也许绘制的图像可能不应该旋转。当人们在纸上绘画时,他们经常旋转纸张以将图像的一部分倒置或以一定角度绘制 - 如果图像自动旋转,这种技术可能是不可能的。理想情况下,用户可以选择纵向或横向图像。例如也许你应该在他们开始绘图时修复图像方向。
我首先要尝试的是在您的视图控制器中实现自定义方法来改变元素的位置和旋转:
-(void) updateLandscape;
和
-(void) updatePortrait;
并注册方向更改通知:
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil];
- (void)orientationChanged:(NSNotification *)notification
currentOrientation = [[UIDevice currentDevice] orientation];
if ( currentOrientation == UIDeviceOrientationLandscapeLeft || currentOrientation == UIDeviceOrientationLandscapeRight )
[self updateLandscape];
else
if ( currentOrientation == UIDeviceOrientationPortrait || currentOrientation == UIDeviceOrientationPortraitUpsideDown )
[self updatePortrait];
else
if ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeLeft || [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeRight)
[self updateLandscape];
else
[self updatePortrait];
【讨论】:
以上是关于如何在一个视图不应该自动旋转而一个视图应该自动旋转的 iOS 应用程序中处理自动旋转?的主要内容,如果未能解决你的问题,请参考以下文章
如何以编程方式自动旋转UIScrollView和UIImageView?