Эффект параллакса в разделе таблицы. Заголовок выдает ошибку UIView-nil? - PullRequest
0 голосов
/ 08 июля 2019

У меня есть собственный заголовок UITableViewHeaderFooterView. Я взял расширение для этой статьи Swift - Вид заголовка Parallax - ячейки перекрытия ScrollView .

import UIKit

class CustomSoccerHeaderView: UITableViewHeaderFooterView {

    var clickBravisso: Soccer?
    @IBOutlet weak var bravoBtn: UIButton!
    @IBOutlet weak var countBravo: UILabel!
   @IBOutlet weak var nameHeader: UILabel!
    @IBOutlet weak var imageHeader: UIImageView!
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code



    }


extension UITableView {

    func addImageHeaderView(headerView: UIView, height: CGFloat) {
        self.contentInset = UIEdgeInsets(top: height, left: 0, bottom: 0, right: 0)
        self.contentOffset = CGPoint(x: 0, y: -height)
        self.tableHeaderView = headerView
        self.tableHeaderView?.frame = CGRect(x: 0, y: 0, width: self.bounds.width, height: height)
    }

    func updateHeaderView(height kTableHeaderHeight: CGFloat) {

        var headerRect = CGRect(x: 0, y: -kTableHeaderHeight , width: self.bounds.width, height: kTableHeaderHeight)
        if self.contentOffset.y < -kTableHeaderHeight {
            headerRect.origin.y = self.contentOffset.y
            headerRect.size.height = -self.contentOffset.y
        }
        self.tableHeaderView?.frame = headerRect
    }

}

В методе загрузки данных в заголовок ячейки. Установлен в функцию для реализации эффекта Параллакса. Буду очень признателен, кто сможет подсказать и исправить меня. Опыта в этом недостаточно и не удается найти статья права.

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

        let header = tableView.dequeueReusableHeaderFooterView(withIdentifier: "CustomSoccerHeaderView") as! CustomSoccerHeaderView

        header.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 350)

        header.clickBravisso = detailSoccer

        header.nameHeader.text = detailSoccer.matchS
        header.countBravo.text = ""


        // header.bravoBtn.addTarget(CustomSoccerHeaderView(), action: #selector(CustomSoccerHeaderView.likeBtn(_:)), for: UIControlEvents.touchUpInside)


        detailSoccer.imagePrS.getDataInBackground { (data, error) in
            header.imageHeader.image = error == nil ? UIImage(data: data!) : nil
        }


        return header
    }

    class DetailSoccerTableViewController: UIViewController,UITableViewDelegate,UITableViewDataSource,UIScrollViewDelegate  {

    @IBOutlet weak var tableView: UITableView!

        var detailSoccer: Soccer!
        var selectedSoccer = [Soccer]()

        var headerView: UIView!

    override func viewDidLoad() {
            super.viewDidLoad()

            let backButton = UIBarButtonItem()
            backButton.title = ""

           self.navigationController?.navigationBar.topItem?.backBarButtonItem = backButton

           // self.navigationItem.rightBarButtonItem = barButton
          //  self.navigationItem.rightBarButtonItem?.tintColor = UIColor.universalColorYellow
            let yourBackImage = UIImage(named: "backItem")
            self.navigationController?.navigationBar.backIndicatorImage = yourBackImage
            self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = yourBackImage
            self.navigationController?.navigationItem.leftItemsSupplementBackButton = true
            self.navigationController?.navigationBar.tintColor = UIColor.universalColorYellow


            //title = detailSoccer.detailTitleS

            let nib: UINib = UINib(nibName: "CustomSoccerHeaderView", bundle: nil)
            tableView.register(nib, forHeaderFooterViewReuseIdentifier: "CustomSoccerHeaderView")


            tableView.tableFooterView = UIView(frame: .zero)

            //tableView.layer.masksToBounds = true
            tableView.estimatedRowHeight = 280
            tableView.rowHeight = UITableView.automaticDimension
            tableView.separatorStyle = .none
            tableView.delegate = self
            tableView.dataSource = self
            tableView.register(UINib(nibName:"FootTableViewCell",bundle:nil), forCellReuseIdentifier: "cellSoc")
            self.view.addSubview(tableView)

            self.edgesForExtendedLayout = UIRectEdge.init(rawValue: 0)
            self.extendedLayoutIncludesOpaqueBars = true

            tableView.addImageHeaderView(headerView: headerView, height: 0)// error 

            tableView.reloadData()
            loadMatchSoccer()

            tableView.rowHeight = UITableView.automaticDimension

        }
 func scrollViewDidScroll(_ scrollView: UIScrollView) {
        tableView.updateHeaderView(height: 200)
    }

        }

эта строка выдает ошибку - tableView.addImageHeaderView(headerView: headerView, height: 0) headerView = (UIView?) Nil

Ответы [ 2 ]

0 голосов
/ 08 июля 2019

Если ваш пользовательский вид определен в xib, попробуйте изменить эту строку:

var headerView: UIView!

К этому:

lazy var headerView: CustomSoccerHeaderView = {
    return Bundle.main.loadNibNamed("CustomSoccerHeaderView", owner: nil, options: nil)!.first as! CustomSoccerHeaderView
}()

Будьте осторожны, чтобы не запутаться в двух понятиях:

  1. UITableViewHeaderFooterView - имеет определенные дочерние представления, в которые следует вносить свои настройки, в идеале их следует регистрировать с идентификатором.
  2. tableHeaderView - это просто любой старый подкласс UIView, не участвующий в механизме повторного использования ячейки.

Как описано, вам нужен второй вариант, но ваш опубликованный код, кажется, работает для поддержки первого варианта.

0 голосов
/ 08 июля 2019

Вы не инициализированы headerView

Перед добавлением этой строки

tableView.addImageHeaderView(headerView: headerView, height: 0)

добавьте еще одну строку в init headerView.

headerView = UIView(frame: CGRect(x: 0, y: 0, width: self.bounds.width, height: height))

добавьте ваш код в viewDidLoad, наконец, будет выглядеть так

headerView = UIView(frame: CGRect(x: 0, y: 0, width: self.bounds.width, height: height))
tableView.addImageHeaderView(headerView: headerView, height: 0)
...