Я пытаюсь реализовать метод, в котором у меня есть 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!
}
Вот что он делает
ОБНОВЛЕНИЕ:
Я реализовал сгруппированный просмотр таблицы и настройку оценкаSectioHeaderHeight в viewForSectionInHeader и теперь сегментированный элемент управления перемещается вверх и вниз, но при прокрутке вверх он не торчит ниже панели навигации. Также, похоже, сейчас есть проблема с форматированием. Вот как выглядит симулятор