Разработка iPhone/iPod touch приложений: Отключение touch событий.

donttouch

Довольно-таки часто в iPhone-программировании возникают ситуации, когда надо бы полностью отключить touch события. Например, во время загрузки контента, либо при выполнении анимации. Сначала я использовал userInteractionEnabled для всех view, которые не должны были получать события.


//Отключаем все события для view
self.view.userInteractionEnabled = NO;

Либо создавал дополнительный прозрачный transparentView . Кстати, такой подход позволяет иногда добиться неплохих результатов, особенно, в случае, если данный transparentView  не пустой, а полупрозрачный, и содержит, например, “крутяшку”, и текст “Loading…”.


UIView * transparentView = [[[UIView alloc]
                   initWithFrame:CGRectMake(0,0,320,480)] autorelease];
transparentView.userInteractionEnabled = YES;
//Иногда, если ставишь alpha == 0, не работает
transparentView.alpha = 0.01;
[self.view.window addSubview:transparentView];

И это еще не все.  При желании для наших целей можно использовать перегрузку метода -(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent*)event


- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
  // метод должен возвращать самый "глубокий" view, но
  // т.к. нам совсем не нужно, чтобы события обрабатывались
  // всеми view'ами, то единственным, кто их будет обрабатывать
  // будет текущий view(self)
  return self;
}

Один способ лучше другого ;) Но, как оказалось, есть еще один, более простой способ запретить обработку ВСЕХ touch событий


// Выключаем обработку ВСЕХ touch событий

[[UIApplication sharedApplication] beginIgnoringInteractionEvents];

// А теперь - включаем обратно

[[UIApplication sharedApplication] endIgnoringInteractionEvents];

Непонятный exclusiveTouch

Должен немного еще сказать о свойстве UIView.exсlusiveTouch. Мне довелось некоторое время с ним помучаться. Так, если выходить из того, что  написано в документации, то можно, якобы содать view, который будет единственным, кто будет принимать события во всем window. Однако не все так хорошо, как хотелось бы. На самом деле если выставить данное свойство в YES, то вы можете  быть уверены лишь в том, что если в текущий момент этот UIView получает touch события, то больше ни один view в этом окне не сможет получать touch события.   Вроде так. ;) Если кто-то думает иначе, то я буду рад услышать как все-таки обстоят дела с exсlusiveTouch. В любом случае, для задачи по отключению touch событий, это свойство мне не пригодилось.

Удачного программирования!

Комментарии

Евгений Дудник

в 10:22, 23.07.2009

От меня небольшое уточнение.
На самом деле, когда блокируются все touch события методом
[[UIApplication sharedApplication] beginIgnoringInteractionEvents], инкрементируется счетчик блокирований. Поэтому нужно следить, чтобы метод [[UIApplication sharedApplication] endIgnoringInteractionEvents] вызывался столько же раз, сколько и beginIgnoringInteractionEvents.

[...] нажатий. Об этом уже писал Павел Тайкало в статье Разработка iPhone/iPod touch приложений: Отключение touch событи…. код наведен [...]

Оставить комментарий