Ответ 1
Пожалуйста, установите вид прокрутки в нужном направлении, а также координату, для которой требуется прокрутка, и используйте правильное соединение с XIB, тогда оно будет работать хорошо.
при прокрутке по горизонтали в 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, и единственными свойствами, установленными в scrollview, являются:
self.showsHorizontalScrollIndicator = YES;
self.scrollsToTop = NO;
self.delegate = self;
Взгляды scrollview добавляются один раз из вызова viewwillappear в uiviewcontroller, на котором размещается uiscrollview (и contentSize устанавливается соответствующим образом). Прокрутка, ожидание немного, и прокрутка снова отлично работает.
Пожалуйста, установите вид прокрутки в нужном направлении, а также координату, для которой требуется прокрутка, и используйте правильное соединение с XIB, тогда оно будет работать хорошо.
Возможно, вам нужно настроить свойство bouncesZoom
?
scrollviewobject.bouncesZoom = NO;
вы можете попробовать это как
- (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];
}
Если вы хотите, чтобы UIScrollView прокручивался немного медленнее, вы могли бы, например, добавить NSTimer, когда пользователь прокручивал, и установить содержимое скроллеровOffset немного назад с такой анимацией:
Объявить в .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; }