在UIViewController
旋转方法中,我在执行设备旋转时遇到问题
方法内部
-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
我的值不正确
根据文件:
在用户界面开始之前发送到视图控制器 旋转。子类可以重写此方法以执行其他操作 轮换前的行动。例如,您可以使用 此方法可禁用视图交互,停止媒体播放或 暂时关闭昂贵的绘图或实时更新。你也可以 用它来交换当前视图以反映新视图 界面方向。 调用此方法时, interfaceOrientation属性仍包含视图的原始属性 方向。 您对此方法的实现必须调用super 在执行期间的某些方面。无论如何调用此方法 您的代码是执行一步还是两步旋转。
我正在设备竖起(启动应用程序后,设备处于纵向模式) - 所有视图都正确对齐纵向模式
但是在方法中我得到了错误的值:
-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
// getting the wrong interface orientation here!!!!
// just checking the current orientation for debug
UIInterfaceOrientation currentOrientation = self.interfaceOrientation;
// the first time the device is rotated getting this value for current orientation:
// currentOrientation == UIInterfaceOrientationLandscapeRight
}
甚至比这种错误方向的奇怪情况更糟糕的是,在“将旋转到界面方向”的同一方法中,当前界面方向和目标界面方向是相同的,即:
self.interfaceOrientation === toInterfaceOrientation
那么这个方法的重点是框架???
这导致我的所有UIView放置代码在设备初始旋转时无法正确计算。
为什么这个标志设置不正确?!?!
P.S
第二次旋转设备后 - 标记设置正确,视图“正确”对齐。
答案 0 :(得分:0)
你会得到正确的值,假设你在端口仪式中持有设备,然后你把它转为横向模式,然后这个方法叫做
//首先调用
-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
//check which orientation hear
if(toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight)
{
NSLog(@"turning t landscape");
}
else
{
NSLog(@"turning t portrite");
}
}
listen toInterfaceOrientation
方法包含(对于我们的示例)UIInterfaceOrientationLandscapeRight or
UIInterfaceOrientationLandscapeLeft`,这表示设备将转向横向左侧或仪式
之后,下面按顺序调用
- (void)viewWillLayoutSubviews
- (void)willAnimateRotationToInterfaceOrientation:duration:
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
被叫,听到最后一个方法fromInterfaceOrientation
包含(对于我们的示例)旧值或以前的方向标记,即UIInterfaceOrientationPortraitUpsideDown
或UIInterfaceOrientationPortrait
你想知道当前的方向,然后你可以使用
UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
if(UIInterfaceOrientationIsLandscape(orientation))
{
NSLog(@"landscape");
}
else
{
NSLog(@"portrite");
}
有关此内容的详情,请参阅此docs