2015-01-26 3 views
0

У меня есть UIView подкласс, все это нужно сделать, это:Как отключить SuperView touchBegan события

@implement MyView 
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 
    [super touchesBegan:touches withEvent:event]; 
    NSLog(@"touch began"); 
} 
@end 

Теперь я создаю два экземпляра MyView, один (C) является 50px высоты, другой (S) высота 100px. Более короткий (C) является подзором более высокого (S), у них есть другой цвет фона.

Затем я запускаю приложение и нажимаю на C, и C и S получают прикосновение к событиюBegan.

Мои вопросы, как я могу предотвратить S (наблюдение) от получения события касания, когда я нажимаю на C? В то время как C над ним (если C является экземпляром UIButton, он работает так, как ожидалось).

Для изображения ниже:

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

enter image description here

---- отредактирован 1 ----

Этот метод работает только тогда, когда я использую только MyView, это не мешает распространение события:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 
    [super touchesBegan:touches withEvent:event]; 
    UITouch *touch = [touches anyObject]; 
    if(touch.view != self){ 
     // ignore the event 
     return; 
    } 
    NSLog(@"touch began"); 
} 

---- редакция 2 ----

см @ комментарий TomasCamin в

+0

Есть ли какой-либо метод, как мы делаем с javascript в веб-браузере , с javascript, это 'event.preventDefault()' – ideawu

+0

на самом деле это 'event.stopPropagation()' в браузере. preventDefault делает больше, чем stopPropagation. – glyuck

+0

Я просто попытался воспроизвести вашу проблему на iOS 8.1, но не смог этого сделать. Прикосновения к C не распространяются на S, если только я не назову '[super touchhesBegan: касается событияEvent: event];' в 'MyView'' touchhesBegan: touchhes' –

ответ

0
//your (S) view code 
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint location = [touch locationInView:self]; 
    if (CGRectContainsPoint(yourCView.frame,location)) 
    return; 
} 
+0

Это просто не работает. Вы должны заметить, что оба вида перекрываются. – ideawu

0

вы пробовали UIView.exclusiveTouch?

Редактировать: Хорошо, поскольку я читал об UIView.exclusiveTouch, он отключает прикосновения к другим видам внешнего вида, после того как пользователь начал касаться данного вида.

Попробуйте переопределить pointInside:withEvent:, чтобы вернуть No, если точка находится внутри подсмотра. Затем не следует запускать, если вы вернетесь No.

Редактировать 2: nevermind, это тоже не сработает, потому что оно также заблокирует subviews от получения штрихов. Возможно, вы действительно должны назвать супер, только если удар находится вне подтаблицы:

if (self.subviews.count != 0) { // some naive implementation 
    [super touchesBegan:touches withEvent:event]; 
} 
NSLog(@"touch began"); 

В качестве альтернативы вы можете описать актуальную проблему вы пытаетесь решить, может быть, есть лучшее решение.

+0

Пробовал, как родительский, так и подчиненный, получая событие, когда 'self.exclusiveTouch = YES;' – ideawu

+0

Спасибо за внимание вашего пациента. Я хочу создать пользовательский UIView, который будет обрабатывать событие Tap (не используя UIGuestureRecognizers), как только обработчик события обработает событие, он должен помешать его надстройке обработать его. – ideawu

0

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

- (void)viewDidLoad { 
[super viewDidLoad]; 
    UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(10, 20, 300, 100)]; 
myView.tag = 100; 
myView.backgroundColor = [UIColor blueColor]; 
[self.view addSubview:myView]; 

}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 
UITouch *toucheObject = [touches anyObject]; 
if (toucheObject.view.tag == 100) { 
    // your code 
    NSLog("Your Object Touche"); 
} 

}

+0

Это сработало, но мне нужно общее решение. Потому что много раз мы не можем установить тег для каждого представления. – ideawu

0

Вы, вероятно, вызывая [super touchesBegan:touches withEvent:event]; внутри [MyView touchBegan:withEvent] как я не был в состоянии воспроизвести проблему вы сообщаете.

Если это соответствует вашим потребностям, я бы предпочел использовать UIGestureRecognizer.

Например, если вы пытаетесь перехватить просто прикосновением использовать UITapGestureRecognizer подкласс:

@implementation View 

- (id)initWithFrame:(CGRect)frame { 
    if ((self = [super initWithFrame:frame])) { 
     UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapped:)]; 
     [self addGestureRecognizer:tap]; 
    } 

    return self; 
} 

- (void)tapped:(UIGestureRecognizer *)gesture { 
    NSLog(@"MyView tapped %p", self); 
} 

@end 
+0

Спасибо, я звонил: «[super touchhesBegan: touchesEvent: event];», но я должен был пропустить это в своем вопросе, теперь я добавил его. – ideawu

0

Все, что вам нужно сделать, это удалить

[super touches began:....] 

// и, вероятно, от другого 3 события касания - перемещены: завершены: отменены:

И вы получите то, что хотите. Реализация по умолчанию (которую вы вызываете, передавая событие до вашего суперкласса) - это то, что заставляет событие продолжать цепочку ответов (в супервизор)

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