5

这是一个奇怪的错误,据我所知,这可能只是 Xcode 中的一个问题。我有一个标签栏控制器,其中第一个视图是一个 UITableView (显然)有许多单元格。当您选择一个单元格时,我在 MainStoryboard 上设置了一个 segue 以转到详细视图控制器。我希望在进入详细视图时隐藏标签栏,所以我进入情节提要,选择我的详细视图,然后在以“模拟指标”开头的编辑器屏幕中单击“在推送时隐藏底部栏”。

一切正常,除了当我点击一个单元格时,UITableView 屏幕顶部会闪烁一个黑条,将 tableview 单元格放下(好像单元格在底部的选项卡栏下方),就在之前屏幕推到详细视图。这种影响根本没有害处,但它非常令人不安,我想把它弄平。

我发现的唯一解决方法是取消选中情节提要上的“按下时隐藏底部栏”选项。这确实消除了黑条闪烁,但是当我进入详细视图时,标签栏当然会留在屏幕上,这是我不想要的。

有任何想法吗?

为了完整起见,我继续跑

[self.navigationController setToolbarHidden:YES animated: YES];

在详细视图控制器的 viewWillAppear 方法上(甚至尝试使用故事板选项打开和关闭),但没有区别。工具栏确实隐藏得很好,但我仍然在顶部看到那条黑线。太奇怪了。

4

5 回答 5

2

我知道为时已晚!!!我遇到了同样的问题。看起来视图的自动调整大小掩码与 UIViewAutoresizingFlexibleTopMargin 不正确。我在 xib 文件中检查了这一点。如果您尝试在代码中执行此操作,请确保此标志 -UIViewAutoresizingFlexibleTopMargin - 不包含在自动调整大小掩码中。

希望这对将来的某些人有所帮助

于 2013-02-27T20:33:57.600 回答
2

我知道这有点晚了,但我有同样的问题,我无法用以前的任何答案来解决它。(我想这是 non 被接受的原因)。

问题是viewSecondViewController 的大小与前一个 ViewController 的视图大小相同,因此太小而无法放入隐藏工具栏的 ViewController 中。这就是为什么UITabBarController当转换发生时,a 的黑色背景在顶部可见,并且在viewDidAppear视图上会以正确的大小拉伸。

对我来说,将根 UITabBarController 子类化并将背景颜色设置为与 SecondViewController 相同的背景颜色会有所帮助。

class RootViewController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()

        self.view.backgroundColor = Style.backgroundColor
    }
}

然后您可以在情节提要中选中复选框,它看起来没问题。

附言

如果您有一些视图,即视图底部的位置,则需要设置底部约束,使它们小 49(因为这是工具栏的高度),然后viewDidAppear设置右约束。

例如:
我的视图需要距离底部边缘 44 像素。之前,我将约束设置为 44,并且我对该视图有一些奇怪的行为。它被放置到高度,然后跳到正确的位置。
我通过将约束设置为 -5 (44-49)来解决此问题,然后viewDidAppear将约束设置回 44。现在我具有该视图的正常行为。

于 2017-03-29T05:58:08.990 回答
1

哇,我现在也遇到了同样的问题,非常痛苦,网上没有关于它的信息。

无论如何,对我来说,一个简单的解决方法是更改​​当前视图的 Frame,将 y 坐标向上移动,并使标签栏的高度变大。如果在将新视图推送到导航控制器后直接完成,这可以解决问题。此外,之后无需修复 Frame(再次显示视图时必须更新它)。

单触代码:

UIViewController viewControllerToPush = new MyViewController();
viewControllerToPush.HidesBottomBarWhenPushed = true; // I had this in the MyViewController's constructor, doesn't make any difference
this.NavigationController.PushViewController(viewControllerToPush, true);
float offset = this.TabBarController.TabBar.Frame.Height;
this.View.Frame = new System.Drawing.RectangleF(0, -offset, this.View.Frame.Width, this.View.Frame.Height + offset);

Objective C 代码(未经测试,只是 monotouch 代码的翻译):

UIViewController *viewControllerToPush = [MyViewController new];
viewControllerToPush.hidesBottomBarWhenPushed = YES;    viewControllerToPush.hidesBottomBarWhenPushed = YES;
float offset = self.tabBarController.tabBar.frame.size.height;  float offset = self.tabBarController.tabBar.frame.size.height;
self.view.frame = CGRectMake(0, -offset, self.view.frame.width, self.view.frame.height + offset);   self.view.frame = CGRectMake(0, -offset, self.view.frame.size.width, self.view.frame.size.height + offset);
于 2012-12-19T04:45:57.700 回答
0

在 detailViewController 的 viewWillAppear 中执行此操作,它应该可以正常工作

于 2012-10-26T09:34:15.650 回答
0

子类你的导航控制器,或者只是找到导航栏

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    let backdropEffectView = navigationBar.subviews[0].subviews[0].subviews[0] //_UIBackdropEffectView
    let visualEffectView: UIVisualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .Light))
    visualEffectView.frame = backdropEffectView.frame
    backdropEffectView.superview?.insertSubview(visualEffectView, aboveSubview: backdropEffectView)
    backdropEffectView.removeFromSuperview()
}
于 2015-08-02T21:31:23.623 回答