Добавить представление в UITableView с помощью вставок, есть ли у него какие-либо проблемы? - PullRequest
0 голосов
/ 22 января 2019

Я добавляю представление внизу UITableView (или UICollextionView), но не как ячейку или нижний колонтитул, а просто добавляю его в само табличное представление (так, в UIScrollView), а затем играю с contentInset свитка. Цель этого состоит в том, чтобы держать представление внизу содержимого таблицы, а не в конце содержимого. Таким образом, если содержимое короче границ таблицы, вид виден (левое изображение), но если контент выше, вид отображается в конце содержимого (правое изображение).

footer

Это фрагмент кода:

let yCoord = collectionView.contentSize.height >= view.frame.height - viewHeight
    ? collectionView.contentSize.height
    : view.frame.height - viewHeight

let bottomView = UIView(frame: CGRect(x: 0, y: yCoord, width: collectionView.contentSize.width, height: viewHeight))

collectionView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: viewHeight, right: 0)
collectionView.addSubview(bottomView)

Мне интересно, можно ли считать такой подход каким-либо образом вредным, например, проблемы с AL, поворотами, перезагрузкой таблицы ... Я не идентифицирую их, действительно, это очень похожий подход к функция «до обновления» до iOS 6, но я предпочитаю в этом убедиться, прежде чем запускать ее в производство.

Если это можно считать проблемой, какое решение вы предлагаете помимо добавления новой ячейки?

Ответы [ 3 ]

0 голосов
/ 22 января 2019

Попробуйте этот код ниже.Сделайте ваш цвет нижнего колонтитула прозрачным и поместите один другой вид в нижний колонтитул с ограничениями снизу, слева, справа и по высоте

@IBOutlet weak var footerView: UIView!

   //MARK:- View Controller life cycle method
override func viewDidLoad() {
    super.viewDidLoad()
    yourTableView.addObserver(self, forKeyPath: "contentSize", options: .new, context: nil)
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    yourTableView.removeObserver(self, forKeyPath: "contentSize")
}

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    if(keyPath == "contentSize"){
            let contentHeight: CGFloat = yourTableView.contentSize.height
            let tableHeight = yourTableView.frame.size.height

            if contentHeight < tableHeight {
                footerView.frame = CGRect(x: footerView.frame.origin.x, y: footerView.frame.origin.y, width: footerView.frame.size.width, height: CGFloat(tableHeight - contentHeight + 44.0))
                // 44.0 is your initial footer height which you put in xib

            } else {
                footerView.frame = CGRect(x: footerView.frame.origin.x, y: footerView.frame.origin.y, width: footerView.frame.size.width, height: 44.0)
                 // 44.0 is your initial footer height which you put in xib
            }
    }
}
0 голосов
/ 22 января 2019

Я бы предпочел создать подкласс UIView, который оборачивает представление таблицы и представление плавающего нижнего колонтитула.Я избегаю изменять иерархию представлений классов, полностью управляемых фреймворком, и используя подкласс, было бы легко использовать этот макет в другом месте.Используя событие делегата представления прокрутки scrollViewDidScroll, оно будет обновлять рамку нижнего колонтитула каждый раз, когда пользователь выполняет прокрутку.Кстати, я бы, конечно, использовал ограничения для размещения моего нижнего колонтитула, а не играл с кадрами, которые могут быть изменены.

Есть ли что-то вредное в вашей реализации?

Вы не упомянули, где вы добавили свой код.Если это viewDidLoad, то у вас будут проблемы, если вы используете автоматическое расположение, и кадр представления изменяется из-за поворота или изменения набора признаков.Кроме того, если ваш контент не является статичным, вызов данных перезагрузки сделает недействительным размер содержимого табличного представления, что также создаст неуместное представление нижнего колонтитула.

Где мы должны поместить эти строки кода?

Должны ли мы KVO наблюдать за рамкой табличного представления и его содержимым, чтобы обновлять рамку нижнего колонтитула при каждом их изменении?

Конечно нет!Apple уже предоставила все нужные нам события.По крайней мере, поместите эти строки в viewDidLayoutLayouts и убедитесь, что вы не добавляете нижний колонтитул несколько раз.viewDidLayoutLayouts вызывается каждый раз, когда выкладывается вид контроллера.

0 голосов
/ 22 января 2019

Если вам нужна вышеуказанная функциональность, вы должны взять tableView и вид снизу в scrollView и дать динамическую высоту tableView на основе контента, используя обозреватель контента, и оставить нижний вид в нижней части вида прокрутки и дать tableView как вид сверху вниз идать больше, чем равно или равно, как приписано.

Надеюсь, это сработает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...