Возникли проблемы с LargeTitle и сегментированным элементом управления с представлением таблицы - PullRequest
0 голосов
/ 19 октября 2018

Пример проекта можно найти по адресу https://github.com/SRowley90/LargeTitleIssueTestiOS

Я пытаюсь расположить сегментированный элемент управления под заголовком Large в приложении для iOS.У меня есть UIToolbar, который содержит сегментированный элемент управления внутри.

При прокрутке вверх title и toolbar ведут себя как ожидалось.

При прокрутке вниз панель навигации корректна, но это нене толкайте 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 голосов
/ 14 июня 2019

Использование 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 для изменений и затем переведите toolbar по оси Y.

Даже при том, что он работал нормальнокогда я пытался использовать это решение с UIRefreshControl и большими заголовками, оно не работало хорошо.Я установил управление обновлением следующим образом:

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

высота UINavigationBar изменяется после срабатывания полного обновления.

0 голосов
/ 23 октября 2018

Возьмите делегирование tableView где-нибудь: tableView.delegate = self

Переопределите scrollViewDidScroll и обновите toolbar внешний вид позиции (поскольку реальная позиция не должна меняться в зависимости от того, что имеет хороший эффект отскока.


extension ViewController: UIScrollViewDelegate {
    override func scrollViewDidScroll(_ scrollView: UIScrollView) {
        var verticalOffset = scrollView.contentOffset.y + defaultNavigationBarHeight

        if scrollView.refreshControl?.isRefreshing ?? false {
            verticalOffset += 60 // After is refreshing changes its value the toolbar goes 60 points down
            print(toolbar.frame.origin.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 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...