为啥表格视图部分标题视图出现在表格标题视图上方?

Posted

技术标签:

【中文标题】为啥表格视图部分标题视图出现在表格标题视图上方?【英文标题】:Why are tableview section header views appearing over the table header view?为什么表格视图部分标题视图出现在表格标题视图上方? 【发布时间】:2016-04-09 16:13:46 【问题描述】:

我有一个UITableViewController,我通过以下代码将其标题设为“静态”或“浮动”:

//MARK: Scroll view functions
override func scrollViewDidScroll(scrollView: UIScrollView) 
    //Makes sure the header does not scroll with the table view
    var headerRect = CGRect(x: 0, y: -kTableHeaderHeight, width: tableView.bounds.width, height: kTableHeaderHeight)
    headerRect.origin.y = tableView.contentOffset.y
    headerView.frame = headerRect

我在viewDidLoad() 中按以下方式设置:

override func viewDidLoad()      
        kTableHeaderHeight = self.view.frame.height/3
        headerView = tableView.tableHeaderView
        tableView.tableHeaderView = nil
        self.view.addSubview(headerView)
        tableView.contentInset = UIEdgeInsets(top: kTableHeaderHeight, left: 0, bottom: 0, right: 0)
        tableView.contentOffset = CGPoint(x: 0, y: -kTableHeaderHeight)

由于某种原因,滚动表格视图现在会导致表格视图部分标题在滚动时出现在表格视图上方。有没有办法阻止这种行为?

下面描绘的是浅灰色的表格视图标题和深灰色的部分标题。第 0 节不应该在表格视图标题的“后面”吗?我怎样才能做到这一点?

我还提供了下面的完整代码: 导入 UIKit

class TableViewController: UITableViewController 

private var kTableHeaderHeight: CGFloat = CGFloat()
var headerView: UIView!

// Setting up the table header view
override func viewDidLoad() 
    super.viewDidLoad()
    initialSetup()


//MARK: Table view functions
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCellWithIdentifier("eCell")! as UITableViewCell
    return cell


override func numberOfSectionsInTableView(tableView: UITableView) -> Int 
    return 5


override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    return 3


override func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) 
    // Adding table view header separator
    let header: UITableViewHeaderFooterView = view as! UITableViewHeaderFooterView
    header.contentView.backgroundColor = UIColor(red: 38/255, green: 38/255, blue: 38/255, alpha:1) //38
    header.textLabel?.font = UIFont.preferredFontForTextStyle(UIFontTextStyleCaption1) //headline

    // Adding cell separator
    let separator = UIView(frame: CGRectMake(15, 0, self.view.frame.width,1))
    separator.backgroundColor = UIColor(red: 57/255, green: 57/255, blue: 57/255, alpha: 1)
    header.addSubview(separator)

    header.textLabel!.textColor = UIColor(red: 131/255, green: 131/255, blue: 131/255, alpha: 1)
    self.tableView.sendSubviewToBack(view)


override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? 
    return "Section " + String(section)


//MARK: Scroll view functions
override func scrollViewDidScroll(scrollView: UIScrollView) 
    updateHeaderView()


//MARK: Private Functions
func initialSetup() 
    kTableHeaderHeight = self.view.frame.height/3
    headerView = tableView.tableHeaderView
    tableView.tableHeaderView = nil
    self.view.addSubview(headerView)
    tableView.contentInset = UIEdgeInsets(top: kTableHeaderHeight, left: 0, bottom: 0, right: 0)
    tableView.contentOffset = CGPoint(x: 0, y: -kTableHeaderHeight)



func updateHeaderView() 
    //Makes sure the header does not scroll with the table view
    var headerRect = CGRect(x: 0, y: -kTableHeaderHeight, width: tableView.bounds.width, height: kTableHeaderHeight)
    headerRect.origin.y = tableView.contentOffset.y
    headerView.frame = headerRect

【问题讨论】:

【参考方案1】:

所以我终于想通了,我有点惭愧我之前没有想到这一点。无论如何,添加以下代码修复它:

override func viewWillLayoutSubviews() 
    super.viewWillLayoutSubviews()
    self.tableView.bringSubviewToFront(headerView)

【讨论】:

我正在通过 dequee 获取标题视图。因此,根据您的回答,我如何访问标题视图 如果让 headerView = block1TableView.tableHeaderView block1TableView.bringSubview(toFront: headerView) 不幸的是,这包括滚动条和刷新控制。 :(

以上是关于为啥表格视图部分标题视图出现在表格标题视图上方?的主要内容,如果未能解决你的问题,请参考以下文章

表格视图ios中第一行上方的空格

如何让 UITableView 标题视图出现在响应者链中的表格单元格之前?

如何快速从表格视图的标题视图上方删除空白?

表格视图单元格中的 uicollectionview 出现错误:索引超出范围,为啥?

如何在表格视图的标题中添加多个单元格(不是部分标题)?

删除插入分组 UITableView 上方的空间