UITableView привязать строки вниз - PullRequest
39 голосов
/ 15 апреля 2011

У меня есть UITableView, который должен представить новый контент снизу.Вот как ведет себя табличное представление, когда оно заполнено и вы добавляете новые строки с анимацией.

Я начал его, изменив contentInset по мере появления строк, но затем, когда они меняются, происходит сбой, и записьВ анимации все неправильно ... Моя проблема с этим подходом усугубляется тем фактом, что пользователи могут удалять строки, а содержимое строк обновляется, что приводит к их изменению размера (каждая строка имеет свою собственную высоту, которая изменяется).

Любые рекомендации о том, как сделать так, чтобы строки UITableView всегда отображались в нижней части пространства просмотра UITableView?

Ответы [ 9 ]

72 голосов
/ 16 апреля 2011

У меня есть решение, которое отлично работает для меня, но оно вызывает двойное мышление, поэтому оно не так просто в теории, как на практике ... вроде ...

Шаг 1, примените преобразование к представлению таблицы, вращая его на 180 градусов

tableView.transform = CGAffineTransformMakeRotation(-M_PI);

Шаг 2, поверните необработанную ячейку на 180 градусов в tableView: cellForRowAtIndexPath:

cell.transform = CGAffineTransformMakeRotation(M_PI);

Шаг 3, переверните источник данных. Если вы используете NSMutableArray, вставьте новые объекты в местоположение 0 вместо использования AddObject ...

Теперь сложная часть запоминает, что левый - правый, а правый левый - только на уровне таблицы, поэтому, если вы используете

[tableView insertRowsAtIndexPaths:targetPath withRowAnimation:UITableViewRowAnimationLeft]

теперь должно быть

[tableView insertRowsAtIndexPaths:targetPath withRowAnimation:UITableViewRowAnimationRight]

и то же для удаления и т. Д.

В зависимости от того, какое у вас хранилище данных, вам, возможно, придется обрабатывать это и в обратном порядке ...

Примечание: вращайте ячейки напротив таблицы, в противном случае неточность с плавающей запятой может привести к тому, что преобразование станет идеальным, и вы будете время от времени получать обходы на некоторых графических изображениях, когда будете прокручивать ... незначительные, но раздражающие.

40 голосов
/ 03 июля 2014

Принятый метод создает проблемы для моего приложения - полоса прокрутки находится на неправильной стороне, и она искажает разделители ячеек для UITableViewStyleGrouped

Чтобы исправить это, используйте следующее

tableView.transform = CGAffineTransformMakeScale (1,-1);

и

cell.contentView.transform = CGAffineTransformMakeScale (1,-1);
// if you have an accessory view
cell.accessoryView.transform = CGAffineTransformMakeScale (1,-1); 
16 голосов
/ 05 августа 2014

Аналогично ima747, но поворот на 180 градусов также заставляет индикатор прокрутки переходить в противоположную сторону. Вместо этого я перевернул табличное представление и его ячейки по вертикали.

self.tableView.transform = CGAffineTransformMakeScale(1, -1); //in viewDidLoad

cell.transform = CGAffineTransformMakeScale(1, -1);//in tableView:cellForRowAtIndexPath:
2 голосов
/ 21 декабря 2016

Swift 3.01 - другое решение можно повернуть и перевернуть в виде таблицы. Работает очень хорошо для меня и не связывается с анимацией и требует меньше усилий для перезагрузки данных в табличном представлении.

self.tableView.transform = CGAffineTransform.init(rotationAngle: (-(CGFloat)(Double.pi)))
self.tableView.transform = CGAffineTransform.init(translationX: -view.frame.width, y: view.frame.height)
2 голосов
/ 16 апреля 2011

Создайте заголовок таблицы, который является высотой экрана (в какой бы ориентации вы ни находились). МЕНЬШЕ - высота строк, которые вы хотите видеть. Если строк нет, тогда заголовок - это полная высота табличного представления. По мере добавления строк одновременно уменьшайте высоту заголовка таблицы на высоту новой строки. Это означает изменение высоты рамки представления, которое вы предоставляете для заголовка таблицы. Смысл в том, чтобы заполнить пространство над строками таблицы, чтобы создать видимость того, что строки входят снизу. Использование заголовка таблицы (или заголовка раздела) сдвигает данные таблицы вниз. Вы можете поместить все, что вам нравится, в представление заголовка, даже если оно будет пустым и прозрачным, если хотите.

Это должно иметь тот эффект, который вы ищете, я думаю.

Посмотрите на атрибут tableHeaderView. Вы просто устанавливаете это на представление, которое вы хотите отобразить в заголовке таблицы. Затем вы можете манипулировать им по мере необходимости при добавлении строк. Я не могу вспомнить, насколько сильными должны быть вы, чтобы представление действительно обновлялось в пользовательском интерфейсе. Может быть так же просто, как позвонить setNeedsDisplay, если что.

Либо посмотрите на методы tableView:viewForHeaderInSection: и tableView:heightForHeaderInSection:. Подобно использованию представления заголовка таблицы, вы захотите иметь переменную экземпляра, которую вы настроили один раз, но к которой вы можете получить доступ из этих методов, чтобы вернуть либо само представление, либо его высоту, соответственно. Когда вам нужно изменить представление для (первого) раздела, вы можете использовать reloadSections:withAnimation:, чтобы принудительно обновить представление на экране после изменения высоты (или содержимого) представлений.

Что-нибудь из этого имеет смысл? Я надеюсь, что это так. : -)

0 голосов
/ 17 апреля 2019

Более простой способ - добавить следующие строки внизу cellForRowAtIndexPath

.
if(indexPath.section == self.noOfSections - 1)
    [self scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:([self numberOfRowsInSection:self.noOfSections -1] - 1) inSection:self.noOfSections -1] atScrollPosition:UITableViewScrollPositionBottom animated:animated];
0 голосов
/ 28 декабря 2016
dataSourceArray = dataSourceArray.reversed()

tableView.transform = CGAffineTransform(scaleX: 1, y: -1)

cell.transform = CGAffineTransform(scaleX: 1, y: -1)


func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    if let text = textField.text {
        dataSourceArray.insert(text, at: 0)
        self.tableView.reloadData()
        textField.text = ""
    }
    textField.resignFirstResponder()
    return true
}
0 голосов
/ 10 декабря 2014

Я просто хотел добавить кое-что ко всем этим ответам относительно использования этого метода с UICollectionView ... Иногда при аннулировании макета мои ячейки преобразовывались обратно неправильно, я обнаружил, что в подклассах UICollectionViewCell и UICollectionReusableView Я должен был сделать это:

- (void)applyLayoutAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes {
    [super applyLayoutAttributes:layoutAttributes];
    [self setTransform:CGAffineTransformMakeScale(1, -1)];
}
0 голосов
/ 15 апреля 2011

Хорошо, если вы загрузите ваш просмотр таблицы с помощью NSMutableArray, я бы предложил вам отсортировать массив в обратном порядке. Поэтому представление таблицы будет заполнено так, как вы хотите.

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