'largeTitle of navigationBar collapse after refreshControl.endRefreshing swift

Encountered a problem: largeTitle of navigation bar collapsing to small title ~once per 20 attempts after refreshControl.endRefreshing().

  1. tableView is first subview of subviews hierarchy, and top constraint is to superview (not to safeArea)
  2. refreshControl added to tableView.refreshControl, not as subview of tableView
  3. was trying call navigationBar.sizeToFit() after endRefreshing - not success.

enter image description here

Controller code:

override public func viewDidLoad() {
        super.viewDidLoad()

        definesPresentationContext = true
        title = L10n.Trainers.trainers.uppercased()

        navigationController?.navigationBar.layoutMargins = .init(top: 0, left: 16, bottom: 0, right: 16)

        configureSubviews()
        makeConstraints()

        configureBindings()
        configureActions()

        setupTableView()
        setupResultsTableView()
    }

    override public func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        navigationController?.navigationBar.prefersLargeTitles = true
        navigationController?.navigationItem.largeTitleDisplayMode = .always
        navigationController?.navigationBar.sizeToFit()
    }

    override public func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        navigationController?.navigationItem.largeTitleDisplayMode = .automatic
    }

    override public func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        vm.onViewDidAppear()
        mainView.tableView.refreshControl = mainView.refreshControl
    }

    override public func loadView() {
        view = mainView
    }

Refresh-logic code:

vm.isLoading.drive { [weak self] loading in
            guard let self = self else { return }
            if self.mainView.refreshControl.isRefreshing {
                if !loading {
                    self.mainView.tableView.refreshControl?.endRefreshing()
                }
            } else {
                if loading {
                    var style = LoaderParameters.blue
                    style.installConstraints = false
                    self.mainView.tableView.startLoading(with: style)
                    self.mainView.tableView.existedLoaderView?.centerX().centerY(-40)
                } else {
                    self.mainView.tableView.stopLoadingProgress()
                }
            }
        }.store(in: &subscriptions)

View code:

final class TrainersView: UIView {

override init(frame: CGRect) {
        super.init(frame: frame)
        configureSubviews()
        makeConstraints()
    }

required init?(coder: NSCoder) {
        super.init(coder: coder)
    }

private(set) lazy var refreshControl = UIRefreshControl().configureWithAutoLayout {
        $0.tintColor = Asset.mainGrey.color
    }

    private(set) lazy var topView: UIView = {
        let view = UIView()
        view.backgroundColor = .clear
        return view
    }()

private(set) lazy var tableView = UITableView().configureWithAutoLayout {
        $0.register(TrainerCell.self)
        $0.tableFooterView = UIView()
        $0.showsVerticalScrollIndicator = false
        $0.separatorStyle = .none
        $0.backgroundColor = Asset.mainWhite.color
    }

private func configureSubviews() {
        addSubview(tableView)
        topView.addSubview(segmentedControl)

        tableView.tableHeaderView = topView

        tableView.tableHeaderView?.frame.size.height = 60
        tableView.tableFooterView?.frame.size.height = 40
        tableView.reloadData()
    }

    private func makeConstraints() {
        tableView.pinToSuperview()

        segmentedControl.centerX()
        segmentedControl.bottomAnchor.constraint(equalTo: topView.bottomAnchor, constant: -8).priority(999).activate()
        segmentedControl.widthAnchor ~ widthAnchor - 16 * 2
    }
}


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source