为什么使用半透明的navigationBar中断推送动画将`hidesBottomBarWhenPushed`设置为YES?

时间:2015-01-30 21:39:46

标签: ios uinavigationcontroller uitabbarcontroller

我有一个相当常见的设置,但我看到一个非常奇怪的动画问题。

Storyboard

标签栏内有导航控制器。如果我按下导航控制器,我仍然可以在推送动画期间在导航栏中看到之前的viewController红色视图,但只有当我在目标viewController上将hidesBottomBarWhenPushed设置为yes时(在非常正确)。这是一个简化的问题示例,它可以在故事板中设置。

这是过渡动画。观看导航栏。您可以在后台看到前一个红色视图控制器,部分离开屏幕,然后在最后消失。

有没有人解决过这个问题?我做的事情不受支持吗?这是一个错误吗?我绝对想要保持半透明条形并隐藏标签栏,但是我可以通过其他方式可靠地隐藏标签栏以支持半透明标签栏。

Animation

6 个答案:

答案 0 :(得分:9)

这是我到目前为止所发现的:

#1右上方栏是黑色

顶栏右上角的模糊黑色部分是半透明UIWindow后面的UINavigationbarbackgroundColor默认为blackColor

屏幕截图通过将推送视图的背景设置为clearColor来演示这一点。

enter image description here

作为一种解决方法,将UIWindow的{​​{1}}属性设置为所需的背景颜色可以解决此问题,只要您还具有视图控制器的属性backgroundColor来推送集合到edgesForExtendedLayout

.Top

我认为这是一种解决方法,因为我认为修改UIWindow的backgroundColor属性不一定是我们应该做的。也许,未来的iOS版本可以解决这个问题。

#2在推送动画完成后查看内容“向下移动”

如果你有一个带有底部布局指南的子视图并且视图“向下移动”,我还没有找到任何理想的修复方法。但是,将标签栏设置为隐藏有一定程度的帮助。作为警告并且如预期的那样,在推动动画期间隐藏标签栏也会立即将其隐藏在父视图控制器中(尽管在弹出视图时它会在动画期间再次显示)。

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    window?.backgroundColor = UIColor.whiteColor()
    return true
}

class ViewToPushViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.edgesForExtendedLayout = UIRectEdge.Top
        // Or set it from the Attributes Inspector in IB.
        // See screenshot below.
    }
}

确保ViewToPushViewController的class ViewToPushViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // ... self.tabBarController?.tabBar.hidden = true } } 属性在推送之前设置为hidesBottomBarWhenPushed(在界面构建器属性检查器中或父视图控制器中的true方法中)。

enter image description here

确保在使用后退按钮弹出视图时也测试动画行为。

答案 1 :(得分:2)

您可能拥有UITabBarController类,其背景为空。 窗口默认背景为黑色。

在Swift 2中

不改变应用程序的解剖结构:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point ...
    window?.backgroundColor = UIColor.whiteColor()
    return true
}

答案 2 :(得分:1)

我设置了我的故事板,就像你展示了相同的segues等,并得到了相同的怪异动画。在四处寻找解决方案并使用我得到的代码之后。

在目标视图控制器中使用它,希望这会有所帮助。

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self hideTabBar];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];

    [self showTabBar];
}

- (void)hideTabBar
{
    UITabBar *tabBar = self.tabBarController.tabBar;
    UIView *parent = tabBar.superview;
    UIView *content = [parent.subviews objectAtIndex:0];
    UIView *window = parent.superview;

    [UIView animateWithDuration:0.5
                     animations:^{
                         CGRect tabFrame = tabBar.frame;
                         tabFrame.origin.y = CGRectGetMaxY(window.bounds);
                         tabBar.frame = tabFrame;
                         content.frame = window.bounds;
                     }];
}

- (void)showTabBar
{
    UITabBar *tabBar = self.tabBarController.tabBar;
    UIView *parent = tabBar.superview;
    UIView *content = [parent.subviews objectAtIndex:0];
    UIView *window = parent.superview;

    [UIView animateWithDuration:0.5
                     animations:^{
                         CGRect tabFrame = tabBar.frame;
                         tabFrame.origin.y = CGRectGetMaxY(window.bounds) - CGRectGetHeight(tabBar.frame);
                         tabBar.frame = tabFrame;

                         CGRect contentFrame = content.frame;
                         contentFrame.size.height -= tabFrame.size.height;
                     }];
}

P.S。你是如何制作非常酷的GIF的,非常方便。

答案 3 :(得分:0)

只需在应用程序中设置窗口的背景颜色和导航栏的外观:didFinishLaunchingWithOptions:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window.backgroundColor = [UIColor whiteColor];
    [UINavigationBar appearance].translucent = NO;
    return YES;
}

答案 4 :(得分:0)

设置UITabBarController的视图backgroundColor可以工作

答案 5 :(得分:-1)

我找到了Objective-C的回答!即使它适合你的情况!

AnotherViewController *av = [[AnotherViewController alloc] init];

//设置控制器视图的颜色

self.navigationController.view.backgroundColor = [UIColor whiteColor];

[self setHidesBottomBarWhenPushed:YES];

[self.navigationController pushViewController:av animated:YES];

如果您将视图的颜色更改为特定颜色(红色,蓝色......),您将知道此代码如何工作〜