feat: Add Header transition component

This commit is contained in:
Boyko Mihail 2021-06-02 15:08:12 +03:00
parent 954080891d
commit 5467a1d9f1
1 changed files with 75 additions and 0 deletions

View File

@ -0,0 +1,75 @@
import Foundation
import UIKit
protocol HeaderViewHandlerProtocol: UIViewController {
var largeHeaderView: UIView? { get }
var headerView: UIView? { get }
var tableView: UITableView { get }
func configureHeaderViews()
}
extension HeaderViewHandlerProtocol {
func configureHeaderViews() {}
}
class HeaderTransitionDelegate: NSObject {
private var navigationBarHeight: CGFloat = 0
private var startOffset: CGFloat = 0
private var statusBarHeight: CGFloat = 0
private var isStartSet = true
private weak var headerViewHandler: HeaderViewHandlerProtocol?
init(headerViewHandler: HeaderViewHandlerProtocol) {
self.headerViewHandler = headerViewHandler
super.init()
initialUpdateHeaderView()
}
func updateHeaderView(isNavigationTitleView: Bool = false) {
headerViewHandler?.configureHeaderViews()
headerViewHandler?.navigationController?.navigationBar.topItem?.titleView?.isHidden = !isNavigationTitleView
}
private func initialUpdateHeaderView() {
headerViewHandler?.navigationController?.navigationBar.topItem?.titleView = headerViewHandler?.headerView
headerViewHandler?.headerView?.isHidden = true
headerViewHandler?.tableView.tableHeaderView = headerViewHandler?.largeHeaderView
headerViewHandler?.tableView.delegate = self
updateHeaderView(isNavigationTitleView: false)
}
}
extension HeaderTransitionDelegate: UITableViewDelegate {
func scrollViewDidScroll(_ scrollView: UIScrollView) {
guard let headerHandler = headerViewHandler,
let largeHeaderView = headerHandler.largeHeaderView else {
headerViewHandler?.navigationController?.navigationBar.topItem?.titleView?.isHidden = false
return
}
if isStartSet {
startOffset = -(headerHandler.tableView.contentOffset.y)
navigationBarHeight = headerHandler.navigationController?.navigationBar.bounds.height ?? 0
if #available(iOS 13.0, *) {
statusBarHeight = headerHandler.view.window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0
} else {
statusBarHeight = UIApplication.shared.statusBarFrame.height
}
isStartSet = false
}
let offsetY = scrollView.contentOffset.y + startOffset
let isHidden = offsetY <= (largeHeaderView.frame.height + navigationBarHeight - statusBarHeight)
headerHandler.navigationController?.navigationBar.topItem?.titleView?.isHidden = isHidden
}
}