当以编程方式设置提示时,UINavigationBar重叠UITableView

4
我有一个包含UITableViewControllerUINavigationController。这个导航控制器会推出其他的UITableViewControllers,而这些表视图控制器最终都会有提示语。
问题在于,当我以编程方式设置这个提示语时,它会覆盖在它下面的表视图的内容。
(搜索栏被导航栏遮挡)
我在SO上找到了这篇回答。我在受影响的视图控制器中以两种不同的方式尝试了那里的建议,但没有任何改变:
override func viewDidLoad() {
    super.viewDidLoad()
    self.edgesForExtendedLayout = .None;
    self.extendedLayoutIncludesOpaqueBars = false;
    self.navigationItem.title = NSLocalizedString("Add Anime or Manga", comment: "")
    self.navigationItem.prompt = NSLocalizedString("Search media belonging to this series.",  comment: "")
}

-

override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationItem.title = NSLocalizedString("Add Anime or Manga", comment: "")
    self.navigationItem.prompt = NSLocalizedString("Search media belonging to this series.",  comment: "")
    self.edgesForExtendedLayout = .None;
    self.extendedLayoutIncludesOpaqueBars = false;
}

在同一答案中的评论中,链接到了苹果的这个指南,讲述了如何防止视图重叠。问题在于,UITableViewController似乎没有顶部/底部布局指南,因此我无法创建约束(另一个SO答案表示,在表视图控制器中拥有此类布局是无关紧要的)。

因此,我已经尝试了所有的选项。


你找到解决方法了吗?我遇到了完全相同的问题,只是使用了一个 UIViewController 和一个 UITableView。谢谢。 - Zaphod
@Zaphod 很遗憾,我最终还是将我的设计改成了其他的形式。 - Andy Ibanez
我也有同样的问题... 可能是iOS的一个bug。你知道是否有在这个问题上开放的radar吗? - Zaphod
4个回答

6

我尝试复现了您的问题,似乎当不是所有viewControllers都有提示时,navigationBar就无法正常调整大小。

看起来您需要以某种方式触发UINavigationController的布局。我能使它正常工作的唯一方法是在viewWillAppear:中添加以下内容:

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

    [self.navigationController setNavigationBarHidden:YES];
    [self.navigationController setNavigationBarHidden:NO];

}

也许这个提示是为了在整个应用程序中保持一致使用(即所有的视图控制器都有或都没有),这就是为什么 UINavigationController 在更改时不会布局其子视图的原因。
希望对你也有帮助。

由于某些原因,这似乎对我不起作用。我不确定是否与setNavigationBarHidden还期望一个布尔参数来进行动画有关,但当导航栏重新出现时,它仍然重叠。我将继续向Apple提交错误报告。谢谢你的帮助! - Andy Ibanez

2

从文档大纲中选择您的TableViewController,并在属性检查器中将顶部栏的值更改为半透明导航栏。请确保不要选择uitableview,而应从文档大纲中选择您的表视图控制器(也称为文件所有者)。


忘了提到我已经这样做了。如果我在创建navigationItem之前设置提示,它可以正常工作,但是当我动态设置时就不行了。 - Andy Ibanez
你尝试过 [self.navigationController setNavigationBarHidden:YES]; 吗? - miletliyusuf

2

只有在视图出现后才能设置提示,这样才有效:

    override func viewDidAppear(_ animated: Bool) {
         navigationItem.prompt = "your prompt here"
    }

0

现在是2019年,这个问题仍然没有解决。慢速鼓掌。我拒绝被这样的事情吓倒,所以我用书中最卑鄙的伎俩把iOS打败了。我通过在将UITableView放置在top 44的同时,在UINavigation上进行了一个恶心的-44“y trick”来解决这个问题,我知道这很愚蠢,但它确实有效。我相信新型手机会毁掉我的天才...但是嘿,我已经懒散地留下了无关紧要的代码(因为我很懒),但希望你能看出我做了什么。

没有 y: -44 Hack enter image description here 有 y: -44 Hack enter image description here

let screenSize: CGRect = UIScreen.main.bounds
let navBar = UINavigationBar(frame: CGRect(x: 0, y: -44, width: screenSize.width, height: 44)) //<<--note minus 44
navBar.barTintColor = Globals.Color_BackgroundGrey()
navBar.isTranslucent = false
tableView.contentInset = UIEdgeInsets(top: 44, left: 0, bottom: 0, right: 0); //<--note plus 44
self.edgesForExtendedLayout = []
let navItem = UINavigationItem(title: "Boaty Mc Boatface")
let doneItem = UIBarButtonItem(title: "Back", style: .plain, target: self, action: #selector(done))
navItem.rightBarButtonItem = doneItem
navBar.setItems([navItem], animated: false)
view.addSubview(navBar)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接