如何使用 Swift 在半横幅视图上创建 UITableview 第一个索引单元格显示?

How to create UITableview first index cell show on half banner view using Swift?

我的场景是,我正在尝试创建 UITableviewcard effects 以及顶部横幅。我添加了它将像 stretchable tableview header 一样工作。我通过使用 storyboard 完成的所有事情,但我坚持在 tableviewhalf 上显示第一个 index cell 显示在 banner 头上。我尝试了 multiple 个想法,但没有完成。提供实现此目的的一些想法 design

当前输出:

预期输出:

根据您的演示项目 HERE 我对您现有的代码做了一些更改,例如您的 scrollViewDidScroll 将是:

var lastContentOffset: CGFloat = 0

func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
    self.lastContentOffset = scrollView.contentOffset.y
}


func scrollViewDidScroll(_ scrollView: UIScrollView) {

    if self.lastContentOffset < scrollView.contentOffset.y {
        //Up
        let y = 220 - (scrollView.contentOffset.y + 220)
        let height = min(max(y, 60), 220)
        if height >= 128 {
            imageView.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: height + 70)
        }
    } else if self.lastContentOffset > scrollView.contentOffset.y {
        //Down
        let y = 300 - (scrollView.contentOffset.y + 300)
        let height = min(max(y, 60), 400)
        imageView.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: height + 80)
    }
}

使用上面的代码,我根据您的要求添加了不同的上下条件,并且从情节提要中,我将顶部约束更改为 84,这样您的 table 就不会滚动到顶部。

因此您的完整代码如下所示:

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var tableView: UITableView!

    let imageView = UIImageView()
    var lastContentOffset: CGFloat = 0

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.estimatedRowHeight = 50
        tableView.contentInset = UIEdgeInsetsMake(220, 0, 0, 0)
        tableView.backgroundColor = UIColor.darkGray


        imageView.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: 300)
        imageView.image = UIImage.init(named: "poster")
        imageView.contentMode = .scaleAspectFill
        imageView.clipsToBounds = true
        view.addSubview(imageView)
        self.tableView.backgroundColor = .clear
        self.view.bringSubview(toFront: tableView)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}


extension ViewController: UITableViewDelegate, UITableViewDataSource {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 20
    }
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return UITableViewAutomaticDimension
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "customCell", for: indexPath) as! CustomTableViewCell
        switch indexPath.row % 2 {
        case 0:
            cell.titleLabel.text = "Lorem Ipsum is simply dummy text ."
            cell.contentView.backgroundColor = UIColor.darkGray
        default:
            cell.contentView.backgroundColor = UIColor.black
            cell.titleLabel.text = "There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain..."
            cell.titleLabel.textColor = .white
        }
        return cell
    }

    func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
        self.lastContentOffset = scrollView.contentOffset.y
    }


    func scrollViewDidScroll(_ scrollView: UIScrollView) {

        if self.lastContentOffset < scrollView.contentOffset.y {
            let y = 220 - (scrollView.contentOffset.y + 220)
            let height = min(max(y, 60), 220)
            if height >= 128 {
                imageView.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: height + 70)
            }
        } else if self.lastContentOffset > scrollView.contentOffset.y {
            let y = 300 - (scrollView.contentOffset.y + 300)
            let height = min(max(y, 60), 400)
            imageView.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: height + 80)
        }
    }
}

结果将是:

HERE 是您更新项目的 link。