遇到LargeTitle和带有表格视图的分段控件的问题

时间:2018-10-19 07:44:37

标签: ios swift ios11 nslayoutconstraint

示例项目可在https://github.com/SRowley90/LargeTitleIssueTestiOS

中找到

我正在尝试将分段控件放在iOS应用中大标题下方。我有一个UIToolbar,其中包含分段控件。

向上滚动titletoolbar时的行为符合预期。

向下滚动导航条是正确的,但是不会向下滑动UITabBar或UITableView,这意味着标题位于分段控件的上方,如下面的图片所示。

我很确定这与我设置的约束有关,但是我不知道是什么。

  • TabBar固定在顶部,左侧和右侧。
  • TableView固定在底部,左侧和右侧。
  • tableView垂直固定在TabBar上

我已经设置了位置UITabBarDelegate方法:

func position(for bar: UIBarPositioning) -> UIBarPosition {
    return .topAttached
}

enter image description here

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:0)

tableView的委派到某处: tableView.delegate = self

覆盖scrollViewDidScroll并更新toolbar的位置外观(因为真实位置不应根据具有那样好的反弹效果而改变。

extension ViewController: UIScrollViewDelegate {
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        let verticalOffset = scrollView.contentOffset.y
        if verticalOffset >= 0 {
            toolbar.transform = .identity
        } else {
            toolbar.transform = CGAffineTransform(translationX: 0, y: -verticalOffset)
        }
    }
}

您可以在应用转换之前使用以下检查,以使其对默认的iOS样式更加可靠和自然:

if #available(iOS 11.0, *) {
    guard let navigationController = navigationController else { return }
    guard navigationController.navigationBar.prefersLargeTitles else { return }
    guard navigationController.navigationItem.largeTitleDisplayMode != .never else { return }
}

答案 1 :(得分:0)

对我来说,使用UIScrollViewDelegate在CollectionView和工具栏上不能很好地工作。所以,我做到了:

final class CollectionViewController: UICollectionViewController {
private var observesBag: [NSKeyValueObservation] = []
private let toolbar = UIToolbar()

    override func viewDidLoad() {
        super.viewDidLoad()
        let statusBarHeight = UIApplication.shared.statusBarFrame.height
        let navigationBarHeight = navigationController?.navigationBar.frame.height ?? 0
        let defaultNavigationBarHeight = statusBarHeight + navigationBarHeight

        let observation = navigationController!
            .navigationBar
            .observe(\.center, options: NSKeyValueObservingOptions.new) { [weak self] navBar, _ in
                guard let self = self else { return }
                let newNavigatonBarHeight = navBar.frame.height + statusBarHeight
                let yTranslantion = newNavigatonBarHeight - defaultNavigationBarHeight
                if yTranslantion > 0 {
                    self.toolbar.transform = CGAffineTransform(
                        translationX: 0,
                        y: yTranslantion
                    )
                } else {
                    self.toolbar.transform = .identity
                }

        }
        observesBag.append(observation)
    }
}

观察navigationBar的“中心”进行更改,然后在y轴上平移toolbar

即使当我尝试将此解决方案与UIRefreshControl和大标题一起使用时,它也能很好地工作,但效果并不理想。 我将刷新控件设置为:

   private func setupRefreshControl() {
        let refreshControl = UIRefreshControl()
        self.webView.scrollView.refreshControl = refreshControl
    }

UINavigationBar的高度在完全刷新触发器之后更改。