Подтвердить что ты не робот

Строки привязки UITableView до нижнего уровня

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

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

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

4b9b3361

Ответ 1

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

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

tableView.transform = CGAffineTransformMakeRotation(-M_PI);

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

cell.transform = CGAffineTransformMakeRotation(M_PI);

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

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

[tableView insertRowsAtIndexPaths:targetPath withRowAnimation:UITableViewRowAnimationLeft]

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

[tableView insertRowsAtIndexPaths:targetPath withRowAnimation:UITableViewRowAnimationRight]

и то же самое для удалений и т.д.

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

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

Ответ 2

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

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

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

и

cell.contentView.transform = CGAffineTransformMakeScale (1,-1);
// if you have an accessory view
cell.accessoryView.transform = CGAffineTransformMakeScale (1,-1); 

Ответ 3

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

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

cell.transform = CGAffineTransformMakeScale(1, -1);//in tableView:cellForRowAtIndexPath:

Ответ 4

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

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

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

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

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

Ответ 5

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)

Ответ 6

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

- (void)applyLayoutAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes {
    [super applyLayoutAttributes:layoutAttributes];
    [self setTransform:CGAffineTransformMakeScale(1, -1)];
}

Ответ 7

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
}

Ответ 8

Более простой способ - добавить следующие строки внизу 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];

Ответ 9

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