#ios #objective-c #cocoa-touch #uitableview #uiviewanimation
#iOS #objective-c #cocoa-touch #uitableview #uiviewanimation
Вопрос:
У меня есть UITableView, и когда он перестает прокручиваться (scrollViewDidEndDecelerating:), высота текущей ячейки увеличивается путем установки переменной currentRow и перезагрузки:
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
CGFloat current_offset = self.tableView.contentOffset.y;
currentRow = [self.tableView indexPathForRowAtPoint:CGPointMake(0, current_offset)].row;
[self.tableView beginUpdates];
[self.tableView endUpdates];
};
Анимация работает нормально, но временно не позволяет прокручивать / интерактивно просматривать таблицу. Поэтому, если я коснусь экрана во время расширения ячейки, я не смогу прокручивать, если не повторю попытку.
Есть ли обходной путь или другой способ добиться того же эффекта?
Комментарии:
1. Может быть, вы можете попробовать отключить
userInteractionEnabled
(или другое подобное свойство) до начала анимации и включить его после окончания анимации.2. Может быть, включена функция delaysContentTouches? У меня была именно эта проблема, и даже отключение delaysContentTouches, похоже, не устраняет ее.
3. К сожалению, нет способа прервать
UITableView
анимацию. Обязательно отправьте в Apple сообщение об ошибке с запросом на эту функцию; не забудьте отметить ответ как принятый до истечения срока действия вознаграждения.4. Почему бы не попробовать зафиксировать reloadData вместо beginUpdates и endUpdates? Также вы можете попробовать анимацию фиксации
Ответ №1:
Вы можете использовать этот метод, чтобы остановить анимацию,
но я не уверен, что это не создаст проблем.
- (недействительный)stopAnimations { для (UITableViewCell * ячейка в [self.TableView visibleCells]) { [ячейка.layer removeAllAnimations]; } }
Попробуйте добавить это в свой TableViewController
- (void) Касания began:(NSSet *) касания с событием: (UIEvent *) событие { [самоустанавливающиеся анимации]; }
или попробуйте добавить распознаватель жестов в окно приложения, а затем вызвать stopAinimations при запуске жеста.
Комментарии:
1. Также не поможет. Анимация уже выполняется. Как бы вы вызвали остановку на основе касания UITableView, если касания игнорируются во время анимации?
2. Я уверен, что анимация TableView не отключает MainThread, я думаю, что может быть вызван touchesBegan:withEvent: и анимация может быть прекращена.
3. Это предполагает, что UITableView не отключил взаимодействие с пользователем, в чем я совершенно уверен.
4. @MichaelG.Emmons Я думаю, мы можем добавить прослушиватель в представление или окно навигационного контроллера. В этом случае TableView не может ее отключить.
5. Не стесняйтесь попробовать, чтобы добиться того, о чем просит OP. Вам нужно будет не только остановить анимацию, но и применить то же движение прокрутки к UITableView, которое попытался выполнить пользователь и которое было перехвачено. Это будет ужасно хрупким и хакерским.
Ответ №2:
Если вы используете iOS 7 , вы можете попробовать вызвать обновления таблицы внутри [UIView performWithoutAnimation:]
блока.
Комментарии:
1. Все, что это сделает, это обеспечит мгновенный переход высоты строки. На самом деле проблема не решена.
Ответ №3:
Невозможно прервать анимацию просмотра таблицы, также это нежелательно. Если вы хотите, чтобы tableview отвечал за первое касание, вы можете использовать reloadData
метод вместо beginUpdates
того, чтобы пытаться использовать reloadSection
метод. Это может помочь, но предотвращение анимации не является хорошей идеей.
Комментарии:
1. Можете ли вы подробнее рассказать о том, как это может помочь улучшить отзывчивость, возможно, на примере?
Ответ №4:
Система анимации UITableView полностью непрозрачна. Нет API, который позволял бы вам изменять или переопределять то, что происходит, помимо выбора типа анимации для вставок / удалений. Просмотрите файл заголовка и посмотрите на трассировки стека.
Итак, нет практического способа предотвратить UITableView
блокировку касаний анимацией, и вы не должны этого хотеть. Это может привести к манипулированию удаленной ячейкой. Итак, если вы не любите EXC_BAD_ACCESS
ошибки, не делайте этого.
Обратите внимание, что взаимодействие с пользователем отключено для всех UITableView
анимаций, а не только для обновлений — вставки, удаления и перезагрузки обрабатываются одинаково.
Тем не менее, это кажется разумным для UITableView
анимации, поэтому обязательно отправьте отчет об ошибке в Apple, и, возможно, мы увидим его в будущем обновлении.
Комментарии:
1. Все это прекрасно и здорово, но должна быть возможность прервать анимацию в табличном представлении что-то вроде UIAnimationOptionsAllowUserInteraction
2. Было бы здорово использовать некоторые ссылки на поддержку «это не так» — такой комментарий, как этот, не следует воспринимать дословно.
3. @remus Система анимации UITableView полностью непрозрачна. Нет API, который позволял бы вам изменять или переопределять то, что происходит, помимо выбора типа анимации для вставок / удалений. Просмотрите файл заголовка и посмотрите на трассировки стека.
Ответ №5:
Попробуйте это:
[CATransaction begin];
[self.tableView beginUpdates];
[CATransaction setCompletionBlock: ^{
// Code to be executed upon completion
CGFloat current_offset = self.tableView.contentOffset.y;
currentRow = [self.tableView indexPathForRowAtPoint:CGPointMake(0, current_offset)].row;
}];
[self.tableView endUpdates];
[CATransaction commit];
Наконец, вы можете захотеть зафиксировать анимацию и для tableview
Комментарии:
1. Это может отлично сработать, но я бы хотел, чтобы операция была проверена, прежде чем я назначу награду.
2. Запутанный — ОП не просил вставить новую строку, а развернуть существующую строку после остановки прокрутки. Предполагая, что вы модифицируете код, чтобы выполнять то, что просил OP, добавление обновлений таблицы в транзакцию по-прежнему не приведет к прерыванию анимации расширения строки.
3. @MichaelG.Emmons правильно. Я не уверен, что есть решение. Я решил использовать другой дизайн, который просто накладывает информацию поверх соседних ячеек вместо того, чтобы пытаться расширить ячейки.