我有一个相当常见的设置,但我看到一个非常奇怪的动画问题。
标签栏内有导航控制器。如果我按下导航控制器,我仍然可以在推送动画期间在导航栏中看到之前的viewController红色视图,但只有当我在目标viewController上将hidesBottomBarWhenPushed
设置为yes时(在非常正确)。这是一个简化的问题示例,它可以在故事板中设置。
这是过渡动画。观看导航栏。您可以在后台看到前一个红色视图控制器,部分离开屏幕,然后在最后消失。
有没有人解决过这个问题?我做的事情不受支持吗?这是一个错误吗?我绝对想要保持半透明条形并隐藏标签栏,但是我可以通过其他方式可靠地隐藏标签栏以支持半透明标签栏。
答案 0 :(得分:9)
这是我到目前为止所发现的:
顶栏右上角的模糊黑色部分是半透明UIWindow
后面的UINavigationbar
,backgroundColor
默认为blackColor
。
屏幕截图通过将推送视图的背景设置为clearColor
来演示这一点。
作为一种解决方法,将UIWindow
的{{1}}属性设置为所需的背景颜色可以解决此问题,只要您还具有视图控制器的属性backgroundColor
来推送集合到edgesForExtendedLayout
。
.Top
我认为这是一种解决方法,因为我认为修改UIWindow的backgroundColor属性不一定是我们应该做的。也许,未来的iOS版本可以解决这个问题。
如果你有一个带有底部布局指南的子视图并且视图“向下移动”,我还没有找到任何理想的修复方法。但是,将标签栏设置为隐藏有一定程度的帮助。作为警告并且如预期的那样,在推动动画期间隐藏标签栏也会立即将其隐藏在父视图控制器中(尽管在弹出视图时它会在动画期间再次显示)。
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
方法中)。
确保在使用后退按钮弹出视图时也测试动画行为。
答案 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];
如果您将视图的颜色更改为特定颜色(红色,蓝色......),您将知道此代码如何工作〜