Почему UIScrollView сильно прокручивается, когда я быстро провожу дважды в одном направлении? - PullRequest
12 голосов
/ 29 июля 2011

при горизонтальной прокрутке в UIScrollview, если я быстро проведу два раза в одном и том же направлении, представление прокрутки резко скачет.Есть ли способ предотвратить это?Чтобы объяснить подробно, вот журнал событий из scrollview, где в большинстве методов делегатов я просто печатаю координату x.

scrollViewWillBeginDragging:
    14:55:12.034 Will begin dragging!
    14:55:12.037 - Position -0.000000
scrollViewWillBeginDeceleration:
    14:55:12.129 Deceleration rate 0.998000
    14:55:12.152 + Position 314.000000
scrollViewWillBeginDragging:
    14:55:12.500 Will begin dragging!
    14:55:12.522 - Position 1211.000000
scrollViewWillBeginDeceleration:
    14:55:12.530 Deceleration rate 0.998000
    14:55:12.533 + Position 1389.000000
scrollViewDidScroll: (printing values < 0 && > 6000 (bounds.size.width)
    14:55:12.595 !!! Position 7819.000000
    14:55:12.628 !!! Position 9643.000000
    14:55:12.658 !!! Position 10213.000000
    14:55:12.688 !!! Position 10121.000000
    14:55:12.716 !!! Position 9930.000000
    ... contentoffset.x drops with around 400 each scrollviewdidscroll call ...
    14:55:13.049 !!! Position 6508.000000
scrollViewDidEndDecelerating:
    14:55:13.753 Will end deceleration
    14:55:13.761 * Position 6144.000000

Наиболее заметная вещь в журнале - сразу после scrollViewWillBeginDeceleration, когда перепрыгивает contentoffset.xс ~ 6000 точками за миллисекунды.

Реализация

Uiscrollview и uiscrollviewdelegate находятся в одном классе, подклассе uiscrollview, который также реализует протокол uiscrollviewdelegate,Ничего особенного не делается для contentoffset, и единственные свойства, установленные в просмотре прокрутки:

    self.showsHorizontalScrollIndicator = YES;
    self.scrollsToTop = NO;
    self.delegate = self;

Подвиды scrollview добавляются один раз из вызова viewwillappear в uiviewcontroller, в котором размещается uiscrollview (и contentSize устанавливается соответствующим образом).Прокрутка, ожидание немного, и прокрутка снова работает отлично.

Ответы [ 4 ]

1 голос
/ 27 декабря 2012

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

0 голосов
/ 09 февраля 2012

вы можете попробовать это так

- (void)enableScrollView
{
    scrollView.userInteractionEnabled = YES;
}

- (void)delayScroll:(id)sender
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    //delay userInteraction 0.1 second, prevent second swipe
    [NSThread sleepForTimeInterval:0.1];
    [self performSelectorOnMainThread:@selector(enableScrollView) withObject:nil waitUntilDone:NO];
    [pool release];
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    scrollView.userInteractionEnabled = NO;
    [NSThread detachNewThreadSelector:@selector(delayScroll:) toTarget:self withObject:nil];
}
0 голосов
/ 30 мая 2012

Если вы хотите, чтобы UIScrollView выполнял прокрутку немного медленнее, вы могли бы, например, добавить NSTimer, когда пользователь прокручивает, и установить обратно скроллеры contentOffset с анимацией, например:

Объявить в .h файле:

UIScrollView *myScrollView;
NSTimer *scrollCheckTimer;
BOOL delayScroll;

.m Файл:

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
    if (delayScroll == YES) {
        [scrollCheckTimer invalidate];
        delayScroll = NO;
        [myScrollView setContentOffset:CGPointMake(myScrollView.contentOffset.x - 40, contentOffset.y) animated:YES];
    }
    delayScroll = YES;
    scrollCheckTimer = [NSTimer scheduledTimerWithTimeInterval:0.9 target:self selector:@selector(removeDelayBecouseOfTime) userInfo:nil repeats:NO];
}

- (void)removeDelayBecouseOfTime { delayScroll = NO; }
0 голосов
/ 08 октября 2011

Может быть, вам нужно настроить свойство bouncesZoom?

scrollviewobject.bouncesZoom = NO;
...