2010-05-19 5 views
8

Мне кажется, что я должен это знать, но я был в тупике уже несколько часов, и у меня кончились идеи.performSelector: withObject: afterDelay: не работает от scrollViewDidZoom

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

Итак, я подумал, что я должен запустить performSelector: withObject: withDelay в методе делегата scrollViewDidZoom. Если он истечет, я запишу настройки. Я удаляю запланированный вызов каждый раз, когда вызывается scrollViewDidZoom, и когда жест щепотка заканчивается.

Это то, что у меня есть:

- (void)scrollViewDidZoom:(UIScrollView *)scrollView{ 
    NSLog(@"resetting timer"); 
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(positionLock) object:nil]; 

    [self performSelector:@selector(positionLock) withObject:nil afterDelay:0.4];    
} 

-(void)positionLock{ 
    NSLog(@"position locked "); 
} 

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale{ 

    NSLog(@"deleting timer"); 
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(positionLock) object:nil]; 
} 

Это выход:

2010-05-19 22: 43: 01.931 сброс таймера
2010-05-19 22: 43: 01,964 сброс таймера
2010-05-19 22: 43: 02.231 перезагрузкой таймера
2010-05-19 22: 43: 02,253 сброс таймера
2010-05-19 22: 43: 02,269 сбрасывая таймер
2010-05-19 22: 43: 02,298 сброс таймера
2010-05-19 22: 43: 05,399 удаление таймера

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

Если я заменяю performSelector: withObject: withDelay с простым старым performSelector: Я получаю это:

2010-05-19 23: 08: 30.333 сброса таймера
2010-05-19 23: 08: 30.333 положения запер
2010-05-19 23: 08: 30.366 сбрасывая таймер
2010-05-19 23: 08: 30,367 позиции запертой
2010-05-19 23: 08: 30.688 удаления таймера

Что ISN» t, что я хочу, но служит, чтобы показать, что это только задержка, которая заставляет его не функционировать не что-то делать с тем, что селектор не объявляется в заголовке, является ошибкой или какой-либо другой причиной.

Любые идеи относительно того, почему он не работает?

ответ

19

Я думаю, что события таймера игнорируются во время отслеживания (когда палец вниз для прокрутки или масштабирования). Вам может потребоваться выполнить селектор в другом режиме (см. [NSObject performSelector:withObject:afterDelay:inModes:]). В частности, попробуйте использовать константу NSRunLoopCommonModes для режима.

+0

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

+0

Вы абсолютно правы. Это заставило меня замочить ...! –

3

Просто добавить на то, что сказал Брайан - вот моя реализация его ответ:

[self performSelector:@selector(callMethod) withObject:0 afterDelay:1.0 inModes:@[NSRunLoopCommonModes]]; 

Примечание - inModes: принимает массив режимов.

Смежные вопросы