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