executeSelector: withObject: afterDelay: не работает из scrollViewDidZoom - PullRequest
9 голосов
/ 19 мая 2010

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

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

Так что я подумал, что я должен начать executeSelector: 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 удаление таймера

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

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

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 удаление таймера

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

Есть идеи, почему это не работает?

Ответы [ 2 ]

20 голосов
/ 19 мая 2010

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

5 голосов
/ 06 марта 2014

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...