【问题标题】:Animate visibility of master detail controller of UISplitViewControllerUISplitViewController 的主细节控制器的动画可见性
【发布时间】:2013-10-31 20:31:46
【问题描述】:

在我的 UISplitViewController 中,我希望只允许主视图控制器在纵向或我的详细视图控制器不显示控制器类型MyFullScreenViewController 时显示。我已经实现了 UISplitViewControllerDelegate 来适当地指出这一点。

-(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:,但我怀疑它们不应该允许视图控制器为响应消息而更改动画。但是,如果它们落在动画块之外,主视图控制器有时会消失。

【问题讨论】:

    标签: ios objective-c uikit uisplitviewcontroller


    【解决方案1】:

    动画无法正常工作,因为我从未在 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) {
    
                         }];
    

    【讨论】:

    • 要获取当前方向,您应该使用 UIInterfaceOrientationorientation = [[UIApplication sharedApplication] statusBarOrientation] 而不是 [[UIDevice currentDevice]orientation]
    猜你喜欢
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    相关资源
    最近更新 更多