Контроллер сегмента не прокручивается должным образом - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь реализовать метод, в котором у меня есть tableviewcontroll, у которого есть заголовок, где он показывает изображение головы, а также другой раздел с информацией о пользователе и изображением профиля. Под заголовком я хочу, чтобы был сегментный элемент управления, такой как твиттер, который позволял бы пользователю переключаться между различными видами таблиц. Я хочу, чтобы этот сегментный элемент управления находился ниже представления заголовка, поэтому, когда пользователь перемещается вниз, элемент управления сегментом перемещается вниз вместе с представлением заголовка, когда вы прокручиваете вверх, элемент управления сегмента перемещается вверх с помощью представления заголовка, но затем остается ниже панели навигации, как Пользовательский интерфейс Twitter и Instagram работает. Я реализовал приведенный ниже код, но у меня возникает проблема с тем, что при прокрутке вверх контроллер сегмента не перемещается, но когда я нажимаю на экран, управление сегментами перемещается вниз с видом заголовка. Любая идея, почему он это делает?

Вот код

class RandomTableViewController: UITableViewController {

    @IBOutlet weak var trackImage: UIImageView!

 private let tableHeaderViewHeight: CGFloat = 320.0
        private let tableHeaderViewCutAway: CGFloat = 0.1

        var headerView: HeaderView!
        var headerMaskLayer: CAShapeLayer!

        override func viewDidLoad() {
            super.viewDidLoad()

            self.automaticallyAdjustsScrollViewInsets = false

            tableView.estimatedSectionHeaderHeight = 40.0

            navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
            navigationController?.navigationBar.shadowImage = UIImage()



            tableView.tableFooterView = UIView()

            headerView = tableView.tableHeaderView as! HeaderView
//            headerView.imageView = trackImage
            tableView.tableHeaderView = nil
            tableView.addSubview(headerView)

            tableView.contentInset = UIEdgeInsets(top: tableHeaderViewHeight, left: 0, bottom: 0, right: 0)
            tableView.contentOffset = CGPoint(x: 0, y: -tableHeaderViewHeight + 64)

            //cut away header view
            headerMaskLayer = CAShapeLayer()
            headerMaskLayer.fillColor = UIColor.black.cgColor
            headerView.layer.mask = headerMaskLayer

            let effectiveHeight = tableHeaderViewHeight - tableHeaderViewCutAway/2
            tableView.contentInset = UIEdgeInsets(top: effectiveHeight, left: 0, bottom: 0, right: 0)
            tableView.contentOffset = CGPoint(x: 0, y: -effectiveHeight)

            updateHeaderView()
        }

        func updateHeaderView() {
            let effectiveHeight = tableHeaderViewHeight - tableHeaderViewCutAway/2
            var headerRect = CGRect(x: 0, y: -effectiveHeight, width: tableView.bounds.width, height: tableHeaderViewHeight)

            if tableView.contentOffset.y < -effectiveHeight {
                headerRect.origin.y = tableView.contentOffset.y
                headerRect.size.height = -tableView.contentOffset.y + tableHeaderViewCutAway/2
            }

            headerView.frame = headerRect

            let path = UIBezierPath()
            path.move(to: CGPoint(x: 0, y:0))
            path.addLine(to: CGPoint(x: headerRect.width, y: 0))
            path.addLine(to: CGPoint(x: headerRect.width, y: headerRect.height))
            path.addLine(to: CGPoint(x: 0, y: headerRect.height - tableHeaderViewCutAway))

            headerMaskLayer?.path = path.cgPath
        }

          override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
              self.tableView.decelerationRate = UIScrollView.DecelerationRate.fast
          }

          override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
              return UITableView.automaticDimension
          }



        @IBAction func backButton(_ sender: Any) {
            dismiss(animated: true, completion: nil)
        }

    }

    extension RandomTableViewController {



        override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
             let v = UIView()
            v.backgroundColor = .white
             let segmentedControl = UISegmentedControl(frame: CGRect(x: 10, y: 5, width: tableView.frame.width - 20, height: 30))
             segmentedControl.insertSegment(withTitle: "One", at: 0, animated: false)
             segmentedControl.insertSegment(withTitle: "Two", at: 1, animated: false)
             segmentedControl.insertSegment(withTitle: "Three", at: 2, animated: false)
             v.addSubview(segmentedControl)
             return v
        }



        override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            100

        }

        override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell: UITableViewCell! = tableView.dequeueReusableCell(withIdentifier: "CellID")
            cell.textLabel?.text = "\(indexPath.row)"
            return cell
        }


    }


    extension RandomTableViewController {
        override func scrollViewDidScroll(_ scrollView: UIScrollView) {
            updateHeaderView()
        }
    }

У меня есть собственный код HeaderView, который

import UIKit

class HeaderView: UIView {


    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var trackImage: UIImageView!
    @IBOutlet weak var backButton: UIButton!

}

Вот что он делает

image1

image2

ОБНОВЛЕНИЕ:

Я реализовал сгруппированный просмотр таблицы и настройку оценкаSectioHeaderHeight в viewForSectionInHeader и теперь сегментированный элемент управления перемещается вверх и вниз, но при прокрутке вверх он не торчит ниже панели навигации. Также, похоже, сейчас есть проблема с форматированием. Вот как выглядит симулятор

enter image description here enter image description here

1 Ответ

0 голосов
/ 16 апреля 2020

изменить стиль таблицы на сгруппированный и установить высоту представления сегмента в heightForHeaderInSection. Проверьте, работает ли оно.

...