UITableView прокручивается с определенной скоростью?

Я создаю пользовательский игровой автомат со столбцом, который существует в uitableview.

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

- scrollToRowAtIndexPath:atScrollPosition:animated: 

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

Я ищу способ: A) Уменьшить анимацию прокрутки. Или, B) Измените продолжительность анимации прокрутки на самоопределенное значение.

Эта нормальная анимация прокрутки (с пальцем) показывает этот эффект. Может быть, это глупая идея, но есть ли идея вызвать метод touchesBegan и touchhesDidEnd на моем TableView?

Спасибо, уже

Поскольку UITableView наследуется от UIScrollView, вы также можете использовать setContentOffset: анимированный: таким образом вы можете заставить свой Tableview «прокручивать» определенное количество пикселей по вашему выбору любой стороне, которая вам нравится.

Это можно сделать так же с помощью scrollToRowAtIndexPath: atScrollPosition: анимированные:

Я сделал прототип, чтобы показать вам, как это работает.

Поскольку это делается с помощью таймеров и т. Д., Вы можете установить, как долго будет длиться autoScroll и насколько быстро (и насколько далеко вы используете контент-контент) анимация будет идти.

Это файл .h:

 #import  @interface AutomaticTableViewScrollViewController : UIViewController  { UITableView *slotMachine; NSMutableArray *listOfItems; NSTimer *tableTimer; } @property (nonatomic,retain) UITableView *slotmachine; @property (nonatomic,retain) NSMutableArray *listOfItems; @property (nonatomic,retain) NSTimer *tableTimer; -(void)automaticScroll; -(void)stopscroll; @end 

Это файл .m:

 #import "AutomaticTableViewScrollViewController.h" @implementation AutomaticTableViewScrollViewController @synthesize slotmachine; @synthesize listOfItems; @synthesize tableTimer; -(void)loadView { [super loadView]; slotmachine = [[UITableView alloc] initWithFrame:self.view.frame style:UITableViewStylePlain]; slotmachine.delegate = self; slotmachine.dataSource = self; [self.view addSubview:slotmachine]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; } // Set up the cell... if (indexPath.row % 2 == 0) { cell.textLabel.text = @"blalala"; } return cell; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 99999; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { //you might want to do this action in ur buttonTargetMethod //start timers tableTimer = [NSTimer scheduledTimerWithTimeInterval:0.2 //this value arranges the speed of the autoScroll target:self selector:@selector(automaticScroll) userInfo:nil repeats:YES]; [NSTimer scheduledTimerWithTimeInterval:5 //this arranges the duration of the scroll target:self selector:@selector(stopscroll) userInfo:nil repeats:NO]; } -(void)automaticScroll { [slotmachine setContentOffset:CGPointMake(slotmachine.contentOffset.x, slotmachine.contentOffset.y + 50) animated:YES]; //the 50 stands for the amount of movement every tick the timer will make } -(void)stopscroll { //stop tabletimer again [tableTimer invalidate]; } -(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation { return YES; } @end 

Если у вас возникнут какие-либо вопросы, не стесняйтесь оставлять комментарии, и я подробно остановимся.

Может, нужно посмотреть в этом направлении?

  [UIView animateWithDuration: 1.0 animations: ^{ [tableViewExercises scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:previousSelectedExerciseCell inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO]; }completion: ^(BOOL finished){ } ]; 

Работайте только с анимированными: НЕТ.

Если вы можете потребовать iOS 5, вы можете использовать метод UIScrollViewDelegate scrollViewWillEndDragging:withVelocity:targetContentOffset: Это позволяет вам видеть, как быстро пользователь перемещал палец, где анимация замедления заканчивалась скоростью по умолчанию, и позволяет вам переопределить скорость анимации, чтобы она заканчивалась в другой точке.

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

Как настроить таймер, а затем вызвать свиток при срабатывании таймера:

 start_index = 0; dest_index = 20; timer = [NSTimer scheduledTimerWithTimeInterval:(0.1) target:self selector:@selector(rolling) userInfo:nil repeats:YES]; - (void)rolling { start_index++; if (start_index < dest_index) { NSIndexPath *Index = [NSIndexPath indexPathForRow:start_index inSection:0]; [self.tableView scrollToRowAtIndexPath:Index atScrollPosition:UITableViewScrollPositionMiddle animated:NO]; } else { [timer invalidate]; } } 

Я использую функции анимации фреймворка Sparrow для создания похожих анимаций.

В приведенной выше ссылке приведен пример настройки. Вы можете анимировать любое числовое свойство любого объекта Objective C, и вы можете использовать такие переходы, как «легкость», «облегчение», «легкость в эластичности» и т. Д., Или просто хорошая старая линейная анимация.

Свойство contentSize является CGPoint, хотя, поэтому вам нужно было бы анимировать другое свойство на одном из ваших classов, а затем реализовать фактический метод для функции setterter, чтобы он обновлял contentOffset.

 - (void) setTableScrollPosition:(CGFloat)position { CGPoint newOffset = CGPointMake(0.0, position); scrollView.contentOffset = newOffset; } 

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

 [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), то эти анимации начнут беспокоить вас здесь. Для большой продолжительности анимации они будут очень заметны, и вы можете увидеть странную ячейку beahviour.

В этом случае, когда вы меняете свои фреймы и т. Д., Посмотрите на что-то вроде:

 [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; 

Это кажется слишком запоздалым, но для людей, столкнувшихся с одной и той же проблемой, я надеюсь, что этот ответ будет полезен. Также, пожалуйста, не стесняйтесь руководить мной, если я сделал несколько очевидных (или не столько) ошибок.

Изменить: Ой, я вижу точную вещь выше моего ответа 🙁 В любом случае, это немного более подробно, и я всего лишь новичок 🙂

Вы не можете (насколько мне известно, я везде искал способ сделать это), сделать скорость, которая не является постоянной для

 - scrollToRowAtIndexPath:atScrollPosition:animated: 

Поэтому я бы посоветовал … что, если вам это действительно нужно, сделайте свою собственную анимацию или что-то в этом роде, или сделайте что-нибудь намного легче, что сэкономит вам некоторое время, используйте UIPickerView

  • Swift Playground - Файлы недоступны для чтения
  • Класс PLBuildVersion реализован в обеих структурах
  • Целевой цикл C #import
  • Не удалось подключиться к идентификатору процесса Xcode
  • Codesign API Dropbox не работает в Xcode 4.6.3: «Объект кода вообще не подписан»
  • Xcode Version 6.1 (6A1030) - Ошибка Apple-O-Linker - создание
  • Ошибка Xcode 6 при отправке архива
  • NSBundle pathForResource имеет значение NULL
  • Не удается установить Xcode на OS X Snow Leopard
  • Xcode: TEST против макросов препроцессора DEBUG
  • Ошибка Xcode 4 для обозначения журнала сбоев
  • Давайте будем гением компьютера.