Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何处理iOS应用程序中的自动旋转,其中一个视图不应自动旋转,而一个视图应自动旋转?_Ios_Ipad_Uiview_Uiviewcontroller - Fatal编程技术网

如何处理iOS应用程序中的自动旋转,其中一个视图不应自动旋转,而一个视图应自动旋转?

如何处理iOS应用程序中的自动旋转,其中一个视图不应自动旋转,而一个视图应自动旋转?,ios,ipad,uiview,uiviewcontroller,Ios,Ipad,Uiview,Uiviewcontroller,比方说,如果它是iPad上的一个简单绘图程序,当用户在纵向模式下从(0,0)到(7301000)绘制一条线时,这条线会完整地显示出来。但如果用户将iPad旋转90度,如果我们允许自动旋转,那么底部的线条将被切断 因此,包含画布的视图不应自动旋转 另一方面,如果屏幕上有一个撤销按钮或一个滑动面板,那么这个部分实际上应该根据iPad的旋转状态自动旋转 如何最好地实现这一点?因为通常我们所有的东西都有自动旋转功能,或者根本没有自动旋转功能,但是这种情况需要一半和一半。我必须同意lnafziger的观点

比方说,如果它是iPad上的一个简单绘图程序,当用户在纵向模式下从(0,0)到(7301000)绘制一条线时,这条线会完整地显示出来。但如果用户将iPad旋转90度,如果我们允许自动旋转,那么底部的线条将被切断

因此,包含画布的视图不应自动旋转

另一方面,如果屏幕上有一个撤销按钮或一个滑动面板,那么这个部分实际上应该根据iPad的旋转状态自动旋转


如何最好地实现这一点?因为通常我们所有的东西都有自动旋转功能,或者根本没有自动旋转功能,但是这种情况需要一半和一半。

我必须同意lnafziger的观点,我很难想象用户在旋转设备时希望他们的图形不旋转。在绘图时,图像的上下和左右方面是创造性绘图过程中不可或缺的一部分,因此我会认为,看到视图上的控件旋转,但不让图像旋转,这将是非常奇怪的。总之,我认为即使用户旋转设备,您也确实希望保留图像的上下和左右方向。但我认为你是绝对正确的,当用户旋转设备时,如果图像的纵横比发生变化(即,如果你挤压图像),用户会发现这会让人迷失方向

现在,您提到了一种防止宽高比受到干扰的解决方案,即保持图形图像为方形,例如768x768,并可能使用额外的空间来布置一些控件/工具。更好的是,您可能希望引入由用户可以在其上平移/滚动的页面组成的绘图概念。这样,你就可以根据用户的需要制作任意大小的图像,当用户旋转设备时,图像的“页面”不会改变,只是iPad屏幕上显示的页面上的小视口。如果你确信用户想要旋转图像,那么给他们一个旋转页面的功能,不管设备的方向如何。你可以很容易地将他们想要的所有东西的坐标映射到新的空间中。这种映射应该很容易

但是,如果你决定在他们旋转设备时不旋转图像(尽管我们坚持认为这似乎不是一个好主意),那么似乎有两种方法(假设你不会考虑最简单的解决方案,即在应用程序中只允许一个方向):

首先,可以重新映射用户绘制的对象的所有坐标,然后在旋转完成后重新绘制对象。同样,旋转90度时,所有x,y坐标的重新映射非常简单


其次,您可以将图形放在它自己的图层上,然后在设备旋转时进行调整(例如,如果用户将设备顺时针旋转90度,或PI/2弧度,则逆时针旋转图层PI/2)。在变换后绘制新线或其他对象时,这可能会让我感到困惑,因为您可能需要将新坐标映射到变换层,但我怀疑您可以让它工作。有关更多信息,请参阅文档。如果你用谷歌搜索它,有很多例子。

我同意你的观点,也许绘制的图像不应该旋转。当人们在一张纸上画画时,他们通常会将纸旋转,使图像的一部分倒置或以一定角度画画——如果图像自动旋转,这种技术可能不可能实现。理想情况下,用户将能够选择纵向或横向图像虽然。e、 g.也许你应该在他们开始绘图时确定图像方向

我将首先尝试在视图控制器中实现自定义方法,以更改元素的位置和旋转:

-(void) updateLandscape;

并注册方向更改通知:

[[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缩放会影响纵横比吗?比如说,如果用户画了一个圆。。。如果旋转,则不希望圆变成椭圆形是,这将影响纵横比。就我个人而言,我宁愿看到画布上有一个视觉上可感知的绘图区域和一个不同的背景区域,并且仍然能够旋转我的iPad。因此,在一个视图中,基本上会有一个信箱效果,顶部和底部都有无法绘制的条形图。这将保持相同的纵横比。@lnafziger那么你的意思是只能在768 x 768区域中绘制?(或748 x 748,如果允许状态栏)这只是一个建议。我个人讨厌启动一个应用程序,不得不打开iPad才能使用它。我宁愿让它以任何方式运转,尽管在另一个方向上可能“更好”。如果我在应用程序之间切换,当某些方向不受支持时,它会变得非常烦人!根据应用程序的不同,空间的其余部分可以是侧边或顶部的工具栏,具体取决于它所面向的方向。不管怎样,只要我的2美分。
[[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];
             }   
         }
     }
}