在导航控制器上按下时视图变暗

时间:2014-01-29 09:35:12

标签: ios objective-c uiviewcontroller uinavigationcontroller transitions

我正在通过segues在NavigationController上推送ViewControllers。我有自己的子类NavigationController,它在索引0处插入了UIImageView - 它是我整个应用程序的背景。

问题在于我可以看到当新的视图控制器从右侧进入屏幕时,在开始时就像是在调用viewDidApear之后会出现一些浅黑色覆盖。 / p>

每个视图控制器都有一个self.view.backgroundColor = [UIColor clearColor]。 如果我改变它,一切都很好。 也许我应该以另一种方式设置应用背景? 如果没有,如何避免这种黑暗效应?

在这里你有这种效果的屏幕截图: http://tinypic.com/r/34j9ffs/8

2 个答案:

答案 0 :(得分:3)

这是因为iOS 7中的标准UINavigationController推送动画。当一个新的VC被推入堆栈时,它会覆盖在前一个VC的顶部,并在其下面留下一个小阴影。因此,当您推动具有清晰背景的viewControllers时,您会在转换发生时看到阴影。

有几种可能的解决方案:

  • 在viewControllers上设置背景颜色(由于您的全局背景图片,可能不适合您)。最简单的解决方案,但需要更改您的设计。
  • 使用新的iOS 7 API实现您自己的过渡。请参阅an example hereBig Nerd Ranch here中的文章。如果你想保留你的背景图片,这真的是你的问题的“正确”解决方案。
  • 添加UINavigationController类别以添加更简单的“复古”推送动画,as per this answer。这是一个快速而又苛刻的解决方案。

答案 1 :(得分:0)

我创建了一个应该完成这项工作的自定义推送segue:

ClearBkgPushSegue.h:

#import <UIKit/UIKit.h>

@interface ClearBkgPushSegue : UIStoryboardSegue

@end

ClearBkgPushSegue.m:

#import "ClearBkgPushSegue.h"

@implementation ClearBkgPushSegue


-(void)perform {
    UIViewController *sourceViewController = self.sourceViewController;
    UIViewController *destinationViewController = self.destinationViewController;

    CGRect bounds = [[UIScreen mainScreen] bounds];
    UIWindow *window = [[[UIApplication sharedApplication] delegate] window];

    UIView *destView = destinationViewController.view;
    [window insertSubview:destinationViewController.view aboveSubview:sourceViewController.view];

    destView.frame = CGRectMake(bounds.size.width, destView.frame.origin.y, destView.frame.size.width, destView.frame.size.height);
    [UIView animateWithDuration:.35 delay:0 options:UIViewAnimationOptionCurveEaseOut
                     animations:^{
                         destView.frame = sourceViewController.view.frame;
                         sourceViewController.view.frame = CGRectMake([UIScreen mainScreen].bounds.size.width * -0.33, 0.0, sourceViewController.view.frame.size.width, sourceViewController.view.frame.size.height);
                         sourceViewController.view.alpha = 0;
                     } completion:^(BOOL finished) {
                        [sourceViewController.navigationController pushViewController:destinationViewController animated:NO];
                         sourceViewController.view.alpha = 1;

    }];


}

@end

只需选择你的segue为“自定义”并选择这个课程就可以了。