在IB中,当按下“Hides Bottom Bar When Pushed”时,UITableView顶部的黑条闪烁

时间:2012-10-26 09:03:58

标签: ios uitabbarcontroller uitableview tabbar tabbarcontroller

这是一个奇怪的错误,可能只是我所知道的Xcode中的一个问题。我有一个标签栏控制器,其中第一个视图是一个UITableView(显然)有许多单元格。当您选择一个单元格时,我在MainStoryboard上设置了一个segue以转到详细视图控制器。我希望在进入详细视图时隐藏标签栏,因此我进入故事板,选择了我的详细视图,然后在编辑器界面中单击“隐藏底部栏”,以“模拟指标”开头。 / p>

一切正常,但是当我点击一个单元格时,UITableView屏幕顶部会闪烁一条黑条,向下放下tableview单元格(好像单元格在底部的标签栏下方落下) ,就在屏幕推到细节视图之前。这种效果根本没有害处,但它非常令人不安,我想顺利解决这个问题。

我发现的唯一解决办法就是取消选中故事板上的“推送时隐藏底栏”选项。这确实摆脱了那个黑条闪光,但当我进入细节视图时,标签栏当然停留在屏幕上,这是我不想要的。

有什么想法吗?

为了完整起见,我继续前进

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

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

5 个答案:

答案 0 :(得分:2)

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

希望这将有助于未来的某个人

答案 1 :(得分:1)

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

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

MonoTouch代码:

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);

目标C代码(未经测试,只是单触引代码的翻译):

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);

答案 2 :(得分:1)

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

问题是SecondViewController的view大小与之前ViewController的视图大小相同,因此太小而无法容纳隐藏工具栏的ViewController。这就是为什么在转换发生时顶部可以看到UITabBarController的黑色背景,而viewDidAppear视图会在正确尺寸上拉伸。

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

class RootViewController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()

        self.view.backgroundColor = Style.backgroundColor
    }
}

然后你可以在故事板中选中复选框,它看起来不错。

P.S。

如果你有一些视图,那就是视图底部的位置,你需要设置底部约束,使它们小于49(因为这是工具栏的高度),然后是{{1}设置正确的约束。

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

答案 3 :(得分:0)

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

答案 4 :(得分: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()
}