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

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

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

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

- scrollToRowAtIndexPath:atScrollPosition:animated:

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

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

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

Спасибо уже

4b9b3361

Ответ 1

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

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

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

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

Это файл .h:

#import <UIKit/UIKit.h>

@interface AutomaticTableViewScrollViewController : UIViewController <UITableViewDelegate,UITableViewDataSource>
{
    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

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

Ответ 2

Может понадобиться посмотреть в этом направлении?

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

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

Ответ 3

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

Ответ 4

Общий способ создания приложений-слот-автоматов с помощью UIPickerView, возможно, вам следует проверить это.

Ответ 5

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

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];
}
}

Ответ 6

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

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

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

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

Ответ 7

Я много искал для этого ответа, но в конечном итоге должен был придумать один из моих собственных. Вы можете вызвать метод 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;

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

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

Ответ 8

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

- scrollToRowAtIndexPath:atScrollPosition:animated:

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