gpt4 book ai didi

iOS 7 导航栏在 dismissViewController 后重新定位

转载 作者:行者123 更新时间:2023-11-29 03:19:26 24 4
gpt4 key购买 nike

我在导航 Controller 中嵌入了一个 Controller 。假设我有一个按钮可以稍微重新定位 self.navigationController.navigationBar。然后我确实使用任何 Controller 呈现ViewControllerAnimated(不管它是否是导航),并且在关闭它之后导航栏返回到它的原始位置(实际上它在关闭动画开始时处于其原始位置)。在 iOS 6 及更早版本中,该栏不会自动重新定位。知道如何防止在 iOS 7 中重新定位吗?

最佳答案

好吧,我终于猜对了。

首先 - Apple 不希望我们改变 UINavigationBar 的位置。因此,您应该不惜一切代价避免它。在我的例子中,我有一个应用程序来修复它移动 UINavigationBar 以显示滑出菜单。滑出菜单问题的正确解决方案是将 UINavigationController 放入内部 - 然后您可以滑动整个 UINavigationController 及其内容(无论它是什么),并且一切正常。由于某种原因,UINavigationController 在此应用程序之外。所以,我不得不求助于黑客。如果您有任何不使用它的选项,请不要使用此方法。这是一个 hack,它可能会破坏更多的 iOS 版本,Apple 肯定不会喜欢它。

首先,探索iOS7中新的过渡系统:http://www.doubleencore.com/2013/09/ios-7-custom-transitions/

然后,替换:

[self presentViewController:navigationController animated:YES completion:nil];

if([UIApplication iOS7]) /* or any other custom iOS7 detection method you implement */
{ /* we simulate old transition with nav bar slided out */
navigationController.transitioningDelegate = [OMModalTransitionDelegate new];
}

[self presentViewController:navigationController animated:YES completion:nil];

因此,我们需要一个转换委托(delegate)来模拟标准行为并执行技巧

#import "OMModalTransitionDelegate.h"
#import "OMAnimatedTransitioning.h"

@implementation OMModalTransitionDelegate

- (id <UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source
{
OMAnimatedTransitioning *transitioning = [OMAnimatedTransitioning new];
return transitioning;
}

- (id <UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed
{
OMAnimatedTransitioning *transitioning = [OMAnimatedTransitioning new];
transitioning.reverse = YES;
return transitioning;
}

@end

现在是实际的动画管理器(您必须自己在 UINavigationBar 的类别中实现 sharedBar):

static NSTimeInterval const DEAnimatedTransitionDuration = 0.4f;
static NSTimeInterval const DEAnimatedTransitionMarcoDuration = 0.15f;


@implementation OMAnimatedTransitioning


- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
{
UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
UIView *container = [transitionContext containerView];
UIView *superView = [UINavigationBar sharedBar].superview;
CGRect barFrame = [UINavigationBar sharedBar].frame;
if(self.reverse)
{ /* Trick - first, remove the bar from it's superview before animation starts */
[[UINavigationBar sharedBar] removeFromSuperview];
}
CGRect oldFrame = container.bounds;
if (self.reverse)
{
[container insertSubview:toViewController.view belowSubview:fromViewController.view];
}
else
{
toViewController.view.frame = oldFrame;
toViewController.view.transform = CGAffineTransformMakeTranslation(0, CGRectGetHeight(oldFrame));
[container addSubview:toViewController.view];
}

[UIView animateKeyframesWithDuration:DEAnimatedTransitionDuration delay:0 options:0 animations:^
{
if (self.reverse)
{
fromViewController.view.transform = CGAffineTransformMakeTranslation(0, CGRectGetHeight(oldFrame));
double delayInSeconds = 0.01; /* Trick - after an imperceivable delay - add it back - now it is immune to whatever Apple put there to move it */
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void)
{
[UINavigationBar sharedBar].frame = barFrame;
[superView addSubview:[UINavigationBar sharedBar]];
});

}
else
{
toViewController.view.transform = CGAffineTransformIdentity;
}
} completion:^(BOOL finished) {


[transitionContext completeTransition:finished];
}];
}

- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext
{
return DEAnimatedTransitionDuration;
}
@end

关于iOS 7 导航栏在 dismissViewController 后重新定位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21285040/

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