Я много искал этот ответ, но в итоге мне пришлось придумать свой собственный.Вы можете вызвать метод scrollAutomatics с начальным номером строки, например:
[self scrollAutomatically:0];
Так выглядит эта функция.Я имел дело с таблицей, в которой всегда было 3000 строк, и намеревался прокрутить ее до конца.
- (void) scrollAutomatically:(int) i
{
__block int j = i;
[UIView animateWithDuration: 0//Change this to something more for slower scrolls
animations: ^{
[self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:j inSection:0] atScrollPosition:UITableViewScrollPositionBottom animated:NO];
}
completion: ^(BOOL finished){
j = j + 10;//Changing this number affects speed.
if(j<=2999)//here you could provide the index of destination row
[self scrollAutomatically:j];
else
{
//I had some code here that popped up a UIAlertView.
}
}];
}
Теперь перейдем к скорости прокрутки.
ДЛЯ ДЕЙСТВИТЕЛЬНО БЫСТРЫХ СВИТОК:
Если установить значение, на которое я увеличиваю индекс строки (j) при каждом вызове функции, до 10, т.е. если я пишу j = j+10;
, то мои 3000для прокрутки строк потребовалось около 9 секунд.(3000 * означают FPS, которые я мог собрать).Если я установлю его на j = j+20;
, то 3000 строк заняли около 4,5 секунд.Итак, вы поняли.Чтобы сделать прокрутку медленнее, уменьшите значение приращения.
ДЛЯ МЕДЛЕННЫХ, ЧИТАЕМЫХ СВИТОК:
[UIView animateWithDuration: 1.5//this will directly set your speed. n rows scrolled every 1.5 seconds.
ПРИМЕЧАНИЕ. Если вы меняете фреймы CALayers или Views (например, customView, который вы могли добавитьк contentView вашего tableViewCell), тогда эти анимации начнут вас беспокоить.При большой продолжительности анимации они будут очень заметны, и вы можете увидеть странное поведение клетки.
В этом случае, где бы вы ни меняли свои кадры и т. Д., Смотрите на что-то вроде:
[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
[myView.myCALayer.frame = (CGRect){ { 10, 10 }, { 100, 100 } ];
[CATransaction commit];
Найтивышеприведенное решение здесь .
Возможно, вам также потребуется установить словарь действий для слоя, чтобы он возвращал значения NULL для всех действий.
NSMutableDictionary *newActions = [[NSMutableDictionary alloc] initWithObjectsAndKeys:[NSNull null], @"sublayers", nil];
superlayer.actions = newActions;
Это кажется слишкомпоздно, но для людей, сталкивающихся с той же проблемой, я надеюсь, что этот ответ будет полезным.Также, пожалуйста, не стесняйтесь направлять меня в случае, если я допустил какую-то очевидную (или не очень) грубую ошибку.
Редактировать: Ой, я вижу точную вещь выше моего ответа :( В любом случае, это немного более подробноа я только начинающий :) 1032 *