gpt4 book ai didi

ios - 非全屏和全屏 UIViewController 之间的漂亮滑动过渡

转载 作者:可可西里 更新时间:2023-11-01 03:56:23 37 4
gpt4 key购买 nike

我有一个不是全屏的 View Controller (有一个状态栏),我想呈现一个全屏的模态视图 Controller 。

如果我在动画开始时隐藏状态栏(父级的 viewWillDisappear 或模态的 viewWillAppear),那么片刻父级将在没有状态栏的情况下可见,看起来像个错误。

如果我在动画结束时执行此操作(父级的 viewDidDisappear 或模态的 viewDidAppear),那么状态栏将在模态视图上显示片刻,即它不会显示为模态视图“覆盖它”。

有没有办法很好地做到这一点?

编辑:

一种可能性是创建一个至少在动画持续时间内具有 windowLevel=alert 的 UIWindow。示例 iAd 广告似乎很好地覆盖了状态栏而没有另一个窗口,所以它一定是可能的。

最佳答案

另一个有趣的小项目。这是我能想到的最好的。如果您不介意使用自己的容器 Controller 来管理呈现/关闭 View Controller ,那也不算太糟糕。我尝试以一般方式做事,但如果需要,可以将其整合到带有 ContainerViewController 的应用程序中。

请注意,我只实现了 UIModalTransitionStyleCoverVertical 的等效项。您也可以根据自己的喜好自定义动画。

相关动画代码:

- (void)presentViewController:(UIViewController *)viewControllerToPresent
{
// do nothing if no controller
if (!viewControllerToPresent) return;

[__viewControllers addObject:viewControllerToPresent];
CGRect toFrame = viewControllerToPresent.view.frame;
toFrame.origin = CGPointMake(0, CGRectGetMaxY(self.view.bounds));
viewControllerToPresent.view.frame = toFrame;

[UIView transitionWithView:self.view
duration:0.2
options:UIViewAnimationOptionTransitionNone
animations:^{
[[UIApplication sharedApplication] setStatusBarHidden:viewControllerToPresent.wantsFullScreenLayout withAnimation:UIStatusBarAnimationSlide];
[self.view addSubview:viewControllerToPresent.view];
viewControllerToPresent.view.frame = [UIScreen mainScreen].applicationFrame;
}
completion:nil];
}

- (void)dismissViewController
{
// nothing to dismiss if showing first controller
if (__viewControllers.count <= 1) return;

UIViewController *currentViewController = [__viewControllers lastObject];
UIViewController *previousViewController = [__viewControllers objectAtIndex:__viewControllers.count - 2];

[UIView transitionWithView:self.view
duration:0.2
options:UIViewAnimationOptionTransitionNone
animations:^{
[[UIApplication sharedApplication] setStatusBarHidden:previousViewController.wantsFullScreenLayout withAnimation:UIStatusBarAnimationSlide];
CGRect toFrame = currentViewController.view.frame;
toFrame.origin = CGPointMake(0, CGRectGetMaxY(self.view.bounds));
currentViewController.view.frame = toFrame;
}
completion:^(BOOL finished) {
[currentViewController.view removeFromSuperview];
[__viewControllers removeLastObject];
}];
}

关于ios - 非全屏和全屏 UIViewController 之间的漂亮滑动过渡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8464063/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com