在viewDidAppear之后,无法获得表视图或表视图头的宽度

时间:2016-12-16 04:00:38

标签: ios swift uitableview

func setTableHeader(){
        let headerWidth = Double(tableHeader.frame.width) 
//  also tried    let headerWidth = Double(tableView.frame.width)
        print("header width is \(headerWidth)")
}

func viewWillAppear(){ output --> 351
  setTableHeader()
//also tried in View Did Appear
}

func viewDidDisappear(){ output --> 296
  setTableHeader()
}

输出指的是在Iphone SE上运行时发生的情况。我在带有Iphone 6显示屏的Storyboard中设计了我的tableview和表头。我能够通过更改setTableHeader来反映view.frame.width - (故事板中的左右约束)来获得我想要的结果,但是我想知道为什么我无法使这个工作,以及不那么hacky的工作将是什么?另外,我实际上在setTableHeader中设置表头的子视图的维度,但这些子视图没有约束(编程或故事板),如果相关的话。

谢谢。

2 个答案:

答案 0 :(得分:1)

试试这个,解决方案是覆盖UIViewController()。viewDidLayoutSubviews(),根据它的约束获取标题视图的正确大小,在标题上设置框架,并将其重置为表头视图

override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()

// Dynamic sizing for the header view
if let headerView = tableView.tableHeaderView {
    let height = headerView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize).height
    var headerFrame = headerView.frame

    // If we don't have this check, viewDidLayoutSubviews() will get
    // repeatedly, causing the app to hang.
    if height != headerFrame.size.height {
        headerFrame.size.height = height
        headerView.frame = headerFrame
        tableView.tableHeaderView = headerView
    }
}
}

答案 1 :(得分:0)

请尝试将此代码添加到viewDidLayoutSubviews方法。 所有视图只有改变布局才能获得实际尺寸。在viewDidLayoutSubviews之前和viewDidAppear之后调用的方法viewWillAppear