比如说,如果它是 iPad 上的一个简单的绘图程序,当用户在纵向模式下从 (0,0) 到 (730, 1000) 绘制一条线时,这条线会完整显示。但是如果用户将 iPad 旋转 90 度,如果我们允许自动旋转,那么底部的线将被切断。
所以包含画布的视图不应该自动旋转。
另一方面,如果屏幕上有撤消按钮,或者滑出面板,那么这部分实际上应该根据 iPad 的旋转状态自动旋转。
这如何最好地实施?因为通常我们对所有东西都有自动旋转,或者根本没有自动旋转,但这种情况需要一半一半。
比如说,如果它是 iPad 上的一个简单的绘图程序,当用户在纵向模式下从 (0,0) 到 (730, 1000) 绘制一条线时,这条线会完整显示。但是如果用户将 iPad 旋转 90 度,如果我们允许自动旋转,那么底部的线将被切断。
所以包含画布的视图不应该自动旋转。
另一方面,如果屏幕上有撤消按钮,或者滑出面板,那么这部分实际上应该根据 iPad 的旋转状态自动旋转。
这如何最好地实施?因为通常我们对所有东西都有自动旋转,或者根本没有自动旋转,但这种情况需要一半一半。
我同意你的观点,也许绘制的图像可能不应该旋转。当人们在纸上绘画时,他们经常旋转纸张以将图像的一部分倒置或以一定角度绘制——如果图像自动旋转,这种技术可能是不可能的。理想情况下,用户可以选择纵向或横向图像。例如,也许您应该在他们开始绘图时修复图像方向。
我首先要尝试的是在你的视图控制器中实现自定义方法来改变元素的位置和旋转:
-(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];
}
}
}
}
我必须同意 lnafziger 的观点,我很难想象用户在旋转设备时会希望他们的绘图不旋转。绘图时,图像的上下和左右方面对于创意绘图过程是如此不可或缺,以至于我会认为看到视图上的控件旋转,但图像没有旋转会很奇怪。底线,我认为即使用户旋转设备,您也确实希望保留图像的上下和左右。但我认为你是绝对正确的,如果用户在旋转设备时图像的纵横比发生变化(即,如果你压扁了图像),用户会发现它会迷失方向。
现在,您已经提到了一种防止纵横比受到干扰的解决方案,即保持绘图图像为正方形,例如 768x768,并且可能使用额外的空间来布置一些控件/工具。更好的是,您可能想要引入由用户可以在其上平移/滚动的页面组成的绘图的概念。这样,您可以将图像设置为用户想要的任何大小,并且当用户旋转设备时,图像的“页面”不会改变,只是 iPad 屏幕所代表的页面上的小视口。如果您确信用户想要旋转图像,那么就给他们一个旋转页面的功能,而不管设备方向如何。您可以轻松地将他们想要的所有东西的坐标映射到新空间中。该映射应该很容易。
但是,如果您决定在他们旋转设备时不旋转图像(尽管我们坚持认为这似乎不是一个好主意),似乎有两种方法(假设您不会考虑最简单的解决方案,在应用程序中只允许一个方向):
首先,您可以重新映射用户绘制的对象的所有坐标,然后在旋转完成后重新绘制对象。同样,当您旋转 90 度时,所有 x,y 坐标的重新映射非常简单。
其次,您可以将绘图放在它自己的图层上,然后在设备旋转时执行CGAffineTransformRotate(例如,如果用户将设备旋转 90 度或 PI/2 弧度,顺时针,您将旋转图层 PI/2逆时针)。令我震惊的是,当您在转换后绘制新线或其他对象时,这可能会让人感到困惑,因为您可能必须将新坐标映射到转换后的图层,但我怀疑您可以让它工作。有关详细信息,请参阅CGAffineTransformRotate的文档。如果你用谷歌搜索,那里有很多例子。