// Copyright 2019-present the Material Components for iOS authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. import UIKit import MaterialComponents.MaterialFlexibleHeader /// A table view controller that subclasses UITableViewController. /// /// The purpose of this view controller is to demonstrate how the flexible header view interacts /// with view controllers whose self.view *is* the tracking scroll view. In cases like these, the /// flexible header view often needs to be added as a subview of the tracking scroll view. class ChildOfTrackingScrollViewViewController: UITableViewController { init(title: String? = nil) { super.init(nibName: nil, bundle: nil) self.title = title } required init?(coder aDecoder: NSCoder) { fatalError("NSCoding unsupported") } var headerView: MDCFlexibleHeaderView? override func viewDidLoad() { super.viewDidLoad() tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell") tableView.delegate = self tableView.dataSource = self } override func numberOfSections(in tableView: UITableView) -> Int { return 1 } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 100 } override func tableView( _ tableView: UITableView, cellForRowAt indexPath: IndexPath ) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) let titleString = title ?? "" cell.textLabel?.text = "\(titleString): Row \(indexPath.item)" return cell } override func scrollViewDidScroll(_ scrollView: UIScrollView) { headerView?.trackingScrollDidScroll() } override func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { headerView?.trackingScrollDidEndDecelerating() } override func scrollViewWillEndDragging( _ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer ) { headerView?.trackingScrollWillEndDragging( withVelocity: velocity, targetContentOffset: targetContentOffset) } override func scrollViewDidEndDragging( _ scrollView: UIScrollView, willDecelerate decelerate: Bool ) { headerView?.trackingScrollDidEndDraggingWillDecelerate(decelerate) } }