UIViewController在哪里保留fromInterfaceOrientation信息?

时间:2012-03-25 14:24:23

标签: objective-c ios uiviewcontroller uiinterfaceorientation

我需要在旋转iPhone时对图层进行调整,但前提是它从纵向旋转到横向,反之亦然。如果它从landscapeLeft 180度旋转到landscapeRight,或从纵向180度旋转到portraitUpsideDown,我不需要做任何事情。

因此,为了避免不必要的操作,我运行这样的测试(self是视图控制器):

- (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration {
    BOOL bFromPortrait = UIInterfaceOrientationIsPortrait(self.interfaceOrientation);
    BOOL bToPortrait = UIInterfaceOrientationIsPortrait(interfaceOrientation);    
    if (bFromPortrait != bToPortrait)
            // make adjustments
}

哪个不起作用,因为在调用willAnimate时,self.interfaceOrientation已经被更改以反映新方向,因此bFromPortrait和bToPortrait始终相同且调整永远不会发生。

所以我尝试从willRotate运行此代码,此时“interfaceOrientation属性仍包含视图的原始方向。”但此时图层的主机视图的自动调整尚未进行,所以我有无法访问自动调整大小的帧,它将具有目标方向,没有它我无法进行调整。

所以我添加了一个布尔属性bFromPortrait,以便跟踪iPhone的来源,在willRotate中设置,并在willAnimate中访问它(这有效) :

- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    self.bFromPortrait = UIInterfaceOrientationIsPortrait(self.interfaceOrientation);    
}

- (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    BOOL bToPortrait = UIInterfaceOrientationIsPortrait(toInterfaceOrientation);
    if (self.bFromPortrait != bToPortrait)  
        // Make adjustments.
}

但我注意到,如果我覆盖didRotateFromInterfaceOrientation,其fromInterfaceOrientation arg正确反映了iPhone的来源,即使此方法在之后被称为因此不需要额外的布尔属性bFromPortrait; UIViewController已经跟踪了这些信息 - 但在哪里?我如何访问它?

(你可能会问,为什么不在didRotateFromInterfaceOrientation进行调整。问题是这个方法在动画之后运行,因此调整会动画。为了让调整包含在动画中,他们必须发生在willAnimate。)

1 个答案:

答案 0 :(得分:1)

你可能会过度思考这一点:)

我有类似的问题;这是我用来解决问题的代码:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration
{
    CGSize size = self.view.frame.size;
    CGRect rect;

    if (UIInterfaceOrientationIsLandscape(interfaceOrientation)) 
    {
        rect = CGRectMake(0, 0, size.height, size.width);
    } 
    else
    {
        rect = CGRectMake(0, 0, size.width, size.height);
    }

    // Views that need updating        
    clockFaceView.frame = rect;
    hourIndicatorView.frame = rect;
    minuteIndicatorView.frame = rect;
    // Update viewControllers
    [timeInWordsOverlayController updateBoundsWithRect:rect];
    [actionOveralyViewController updateBoundsWithRect:rect];
}

其中updateBoundsWithRect定义为:

- (void) updateBoundsWithRect:(CGRect)rect
{
    _actionView.frame = rect;
    self.view.frame = rect;
}

您下载免费应用程序并查看代码的结果。 iTunes链接。 希望这会有所帮助。