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