2013-10-22 24 views
1

在我的UISplitViewController中,我希望主視圖控制器只允許在縱向或當我的詳細視圖控制器不顯示控制器類型時顯示,MyFullScreenViewController。我已經實現了UISplitViewControllerDelegate以適當地指出這一點。UISplitViewController的主細節控制器的動畫可見性

-(BOOL)splitViewController:(UISplitViewController *)svc 
    shouldHideViewController:(UIViewController *)vc 
      inOrientation:(UIInterfaceOrientation)orientation 
{ 
    if (UIInterfaceOrientationIsPortrait(orientation) || 
     [[self.navigationController topViewController] isKindOfClass:[MyFullScreenViewController class]]) 
    { 
     return YES; 
    } 
    return NO; 
} 

但是,UISplitViewController僅在旋轉過程中調用委託。所以MyFullScreenViewController實現了viewWillAppear:animatedviewWillDisappear:animated

- (void)viewWillAppear:(BOOL)animated 
{ 
    [self fakeRotationOfSplitViewController]; 
    [super viewWillAppear:animated]; 
} 
- (void)viewWillDisappear:(BOOL)animated 
{ 
    [self fakeRotationOfSplitViewController]; 
    [super viewWillDisappear:animated]; 
} 
-(void)fakeRotationOfSplitViewController 
{ 
    UIInterfaceOrientation orientation = [[UIDevice currentDevice] orientation]; 
    CGFloat duration = 1.0f; 
    CGFloat fakeDuration = 0.0f; 

    [UIView animateWithDuration:duration 
          delay:0.0f 
         options:UIViewAnimationOptionCurveEaseInOut 
        animations:^{ 
         [[self splitViewController] willAnimateRotationToInterfaceOrientation:orientation 
                         duration:fakeDuration]; 
         [[self splitViewController] willRotateToInterfaceOrientation:orientation 
                      duration:fakeDuration]; 
         [[self splitViewController] didRotateFromInterfaceOrientation:orientation]; 
        } completion:^(BOOL finished) { 

        }]; 

} 

除動畫之外的所有東西都可以使用。主視圖控制器立即消失並在UINavigationController對象的推送之前並在流行動畫之前重新出現。

文檔不清楚是否應在動畫塊中調用willRotateToInterfaceOrientation:duration:didRotateFromInterfaceOrientation:,但我懷疑他們不應允許視圖控制器爲響應該消息而對其進行動畫更改。但是,如果它們落在動畫塊之外,則主視圖控制器有時會消失。

回答

2

該動畫無法正常工作,因爲我從未在didRotateFromInterfaceOrientation:之後撥打過viewWillLayoutSubviews

[UIView animateWithDuration:duration 
          delay:0.0f 
         options:UIViewAnimationOptionCurveEaseInOut 
        animations:^{ 
         [[self splitViewController] willAnimateRotationToInterfaceOrientation:orientation 
                         duration:fakeDuration]; 
         [[self splitViewController] willRotateToInterfaceOrientation:orientation 
                      duration:fakeDuration]; 
         [[self splitViewController] didRotateFromInterfaceOrientation:orientation]; 
         [[self splitViewController] viewWillLayoutSubviews]; 
         [[[self splitViewController] view] layoutSubviews]; 
        } completion:^(BOOL finished) { 

        }]; 
+0

爲了得到當前的方向,你應該使用UIInterfaceOrientation方向= [[UIApplication的sharedApplication] statusBarOrientation]而不是[[的UIDevice currentDevice]取向] – ullstrm

相關問題