UITableViewHeaderView默认挂起单元格而不是上面

时间:2014-06-24 02:05:55

标签: uitableview uiscrollview swift

我正在使用UITableView的viewForHeaderInSection方法,但是我已经确定视图会因为默认情况下单元上的不透明度降低而看起来更好,它开始如下:

how it defaults

我希望它默认为这样,就像用户已经向下滚动一样(注意,我想要所有单元格,而不仅仅是当前位于视图顶部的单元格。)

how i'd like it

我可以将视图添加为单元格的子视图,除了我希望它保持功能,如果单元格是顶部单元格,则标题视图保持在屏幕顶部。也许正确的方法是没有标题视图,如果一个单元格是顶部单元格计算视图的原点在单元格上的位置 - 虽然这似乎是一种可能很昂贵的方法,但它可能是只有/最好。

感谢。

PSI希望迅速做到这一点,但客观的C会做。再次感谢

1 个答案:

答案 0 :(得分:3)

这是你想要的吗?

import UIKit

class ViewController: UITableViewController {
    var data = [[String]]()
    var headerOrigins = [CGPoint]()
    var floatingHeaders = [UIView]()

    override func viewDidLoad() {
        super.viewDidLoad()

        data = [["One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eigth", "Nine", "Ten"], ["One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eigth", "Nine", "Ten"], ["One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eigth", "Nine", "Ten"]]

        tableView.dataSource = self
        tableView.delegate = self

        for i in 0..<data.count {
            headerOrigins += tableView(tableView, cellForRowAtIndexPath: NSIndexPath(forRow: 0, inSection: i)).frame.origin

            let floatingHeader = UIView(frame: CGRectMake(0, headerOrigins[i].y, tableView.frame.size.width, 44))
            floatingHeader.backgroundColor = UIColor.redColor()
            floatingHeader.alpha = 0.5

            let label = UILabel(frame: CGRectMake(100, 10, 100, 30))
            label.text = "Header \(i)"
            floatingHeader.addSubview(label)

            tableView.addSubview(floatingHeader)

            floatingHeaders += floatingHeader
        }

    }

    override func numberOfSectionsInTableView(tableView: UITableView!) -> Int {
        return data.count
    }

    override func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int {
        return data[section].count
    }

    override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell
        cell.textLabel.text = data[indexPath.section][indexPath.row]

        return cell
    }

    override func scrollViewDidScroll(scrollView: UIScrollView!) {
        var tableTop = tableView.bounds.origin.y + tableView.scrollIndicatorInsets.top

        if tableTop < 0 {
            floatingHeaders[0].frame.origin.y = 0
        } else {
            for i in 0..<data.count {
                if tableTop > headerOrigins[i].y {
                    floatingHeaders[i].frame.origin.y = tableTop
                } else if tableTop < headerOrigins[i].y {
                    floatingHeaders[i].frame.origin.y = headerOrigins[i].y
                }

            var j = i
            while j > 0 {
                if (CGRectGetMaxY(floatingHeaders[j-1].frame) > floatingHeaders[j].frame.origin.y) {
                    floatingHeaders[j-1].frame.origin.y = floatingHeaders[j].frame.origin.y - floatingHeaders[j].frame.size.height
                }
                j--
            }
        }
    }
}