2013-08-29 2 views
4

Я хочу отключить касания во всех областях экрана отдельно от определенных нескольких точек (например, кнопок). То есть Я не хочу, чтобы «touchhesBegan» запускался вообще, когда я нажимал ничего, кроме кнопки. ВызовОтключить события касания на определенных участках экрана iPhone

self.view.userInteractionEnabled = NO; 

имеет желаемый эффект для того, Я в основном хочу, чтобы кнопка все еще работала, , даже если на экране 5 точек, т. Е. Все сенсорные входы были израсходованы, а кнопка представляет 6-ю.

Возможно ли это?

Я попытался вставить представление с помощью userInteraction, отключенного ниже моих кнопок, но он все еще регистрирует касания, когда пользователь кранит экран. Кажется, единственный способ отключить регистрацию касаний - сделать это на всем экране (на родительском UIView).

ОБНОВЛЕНИЕ: Я попытался использовать распознаватели жестов для обработки всех событий касания и игнорировать те, которые не соответствуют требованиям. Вот мой код:

@interface ViewController : UIViewController <UIGestureRecognizerDelegate> 

...

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    UIGestureRecognizer *allRecognizer = [[UIGestureRecognizer alloc] initWithTarget:self action:nil]; 
    allRecognizer.delegate = self; 
    [self.view addGestureRecognizer:allRecognizer]; 
} 

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 
    CGPoint coords = [touch locationInView:self.view]; 
    NSLog(@"Coords: %g, %g", coords.x, coords.y); 
    if (coords.y < 200) { 
    [self ignoreTouch:touch forEvent:nil]; 
    return TRUE; 
} 
return FALSE; 

} 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    NSLog(@"%i touch(es)", [touches count]); 
} 

Однако экран по-прежнему «читает» штрихи, так что если я помещаю 5 пальцев вниз, шестой один не вызовет нажатие кнопки ...

ответ

6

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

Теперь вам нужно установить невидимую кнопку на «userInteractionEnabled»:

//userInteractionEnabled == NO => self.view registeres touches 
//userInteractionEnabled == YES => self.view doesn't register touches 
[_invisibleButton setUserInteractionEnabled:NO]; 

Что действительно важно в этом решении является то, что оба - невидимым и видимыми кнопками являются прямыми подвидами зрения ОК.

Вы можете загрузить пример проект из моих раздаточных: https://dl.dropboxusercontent.com/u/99449487/DontTapThat.zip

Однако этот пример только предотвращает обработку определенных прикосновений.Полностью игнорирование ввода не является технически возможным: сторонние приложения не несут ответственности за , определяя вход. Они отвечают только за обработки ввода. Обнаружение сенсорного ввода выполняется iOS.

Единственный способ создать такой случай, как вы описываете его в комментариях, - это надеяться, что iOS не будет интерпретировать ввод вашего дела как «палец», потому что он скорее всего будет охватывать область, которая намного больше чем палец.

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

+0

Спасибо за код, однако я боюсь, что он все еще не делает то, что мне нужно. Да, он не вызывает нажатиямиBegan, однако он все еще регистрирует сенсорные точки на экране. Поэтому, если вы коснетесь экрана 5 пальцами, а затем используйте 6-ю кнопку, чтобы нажимать любую из кнопок, она не читается. Я понимаю, что это немного странная проблема. – Smikey

+0

Прошу прощения, но на данный момент у меня нет действительной регистрации программ, чтобы проверить это. Я не знаю, что проблема с регистрацией touchsBegan для вас, но я думаю, что самый простой способ - это забыть про эту невидимую кнопку и просто настроить BOOL, указывает, следует ли использовать код внутри touchhesBegan или нет. Например, если (_useCode) {} Редактировать: Это просто для этого 5-го и 6-го пальцевого корпуса, верно? Я думаю, что на iPhone было что-то в пальце 5 пальцев одновременно. 6-й палец не будет зарегистрирован независимо от того, что вы делаете. –

+0

На самом деле существует 5 пальцевых ограничений, но я надеялся, что если вы проигнорируете пальцы, которые не были в «правильном» месте, это будет читать только те, которые были. Но, похоже, что независимо от того, что вы делаете, он все равно будет читать контакт с экраном, независимо от того, управляете ли вы прикосновением ... Я в основном работаю над корпусом, который покрывает часть экрана, но сделан из проводящего материала, и я не хочу, чтобы он вызывал точки касания на поверхности. Хорошо, спасибо за предложения. – Smikey

0

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

+0

Но эта прозрачная кнопка по-прежнему будет считывать события касания, поэтому, если на кнопке было 5 точек соприкосновения, будет ли она по-прежнему касаться фактической кнопки? – Smikey

+0

Расположите свою кнопку над областью, которую вы хотите отключить. Затем перейдите к инспектору кнопок и снимите флажок «Включение пользователя». Попробуйте это .. – Ganesh

+0

Это не сработает - «touchsBegan» по-прежнему срабатывает, когда вы нажимаете кнопку отключения взаимодействия. – Smikey

0

touchesBegan является метод по умолчанию, поэтому он должен назвать все время, когда прикосновение происходит на виду, так что нет никакого способа отказа, но вы все равно можете сделать одну вещь установить

self.buttonPlayMusic.userInteractionEnabled = FALSE; 

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

+0

Это не так: если я установил userInteractionEnabled в FALSE на кнопку, он все равно запускает touchhesBegan. TouchesBegan не запускает, однако, если для всего корневого представления установлено значение userInteractionEnabled = FALSE; Поэтому мне нужно последнее поведение, с возможностью добавления рабочих кнопок сверху. – Smikey

0

Вы можете добавить UIImageView Управление в этой области, где вы хотите отключить touch event. Вы можете добавить UIImageView объект в верхней части self.view subViews.

Пример // область - это та область, где вы хотите, чтобы отключить связь на self.view

UIImageView *imageView=[[UIImageView alloc]initWithFrame:area]; 

[self.view addSubView:imageView]; 
+0

UIImageView по-прежнему вызывает касанияBegan при нажатии, даже при взаимодействииEnabled = FALSE; Я хочу, чтобы прикосновение было полностью незарегистрировано. – Smikey

0

Вы пробовали использовать UIScrollView в качестве фона? в той области, где вы не хотите, чтобы события касания были уволены.

UIScrollView не вызывает методы касания.

+0

Хорошее предложение, спасибо. Но хотя UIScrollView не вызывает события касания, он фактически считывает контактные точки, поэтому не будет работать для этой цели. – Smikey

3

Существует несколько методов в UIView, что вы можете переопределить:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event; // recursively calls -pointInside:withEvent:. point is in the receiver's coordinate system 
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event; // default returns YES if point is in bounds 

Это должно предотвратить вызвать touchBegin и другие методы.

С уважением.

+0

Я думаю, что это представляет ту же проблему, хотя пальцы, касаясь экрана, все еще считаются точками соприкосновения, и есть еще предел всего 5. – Smikey

0

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

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 

    UITouch *touch = [touches anyObject]; 

    UIButton *touchObject=(UIButton*)[touch view]; 

    if ([touchObject isKindOfClass:[UIButton class]]) 
    { 
     //Do what ever you want on button touch 
    } 
    else{ 
     return; 
    } 
}