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

时间:2015-03-14 19:24:27

标签: ios uitableview uinavigationcontroller autolayout uinavigationbar

我有UINavigationController,其中包含UITableViewController。该导航控制器推送其他UITableViewControllers,最终这些表视图控制器将有一个提示。

问题是,当我以编程方式设置此提示时,它与其下方的表视图的内容重叠。

enter image description here

(导航栏正在隐藏搜索栏)

我在SO中环顾四周,发现this answer。我在受影响的视图控制器中以两种不同的方式尝试了该建议,但没有任何改变:

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

同一答案中的评论与this Apple guide相关联,以防止视图相互重叠。问题是UITableViewController似乎没有顶部/底部布局指南,因此我无法创建约束(another SO answer表示在表视图控制器中表示布局是无关紧要的。)

因此我已经用尽了所有选择。

4 个答案:

答案 0 :(得分:6)

我试图重现您的问题,但似乎并非所有viewControllers都有提示,navigationBar无法正常调整大小。

似乎你需要以某种方式触发UINavigationController的布局。我能使它正常工作的唯一方法是在viewWillAppear:

中添加它
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

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

}

也许这个提示符应在整个应用程序中一致使用(意味着对所有viewControllers都有一个或者没有一个),这就是为什么UINavigationController在更改时不会布局它的子视图。

希望这也适合你。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

只有在视图确实出现时才需要设置提示,然后才能工作:

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

答案 3 :(得分:0)

现在是2019年,但仍未修复。 慢拍手。我拒绝被这样的事情吓倒,所以我以书中最肮脏的把戏{了iOS。我通过在-44上放置UINavigationUITableView上进行令人反感的top 44“ y技巧”来解决此问题,我知道这很愚蠢,但是可以。肯定有新的电话手机会毁了我的天才。.但是,嘿。我懒洋洋地留下了无关的代码(因为我闲着),但希望你能看到我的所作所为。

不存在,-44 Hack enter image description here 当时是-44哈克 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)