2012-10-09 38 views
5

Tôi gặp sự cố với chuỗi sự kiện trả lời trên ứng dụng iOS.Ngăn chế độ xem phụ huynh nhận được sự kiện chạm sau khi xem các hành động trên trẻ em

Vấn đề là sau, tôi có một tập hợp các bản xem trước (bong bóng) ở chế độ xem lớn hơn (hình vuông) và tôi muốn có thể hiển thị một chế độ xem nhất định nếu tôi chạm vào các nút, tuy nhiên nếu tôi nhấn vào bất kỳ nơi nào khác Tôi muốn cùng một chế độ ẩn.

Vấn đề là khi tôi nhấn vào bong bóng, cả hai chế độ xem (con và cha mẹ) đều đang kích hoạt, làm thế nào tôi có thể ngăn chặn điều này?

Nếu đứa trẻ đã hành động trên một sự kiện liên lạc thì đó có phải là sự kết thúc của nó không?

Bubbles của tôi đang dần nhận ra cử chỉ Tap với UITapGestureRecognizer trong khi xem mẹ (hình vuông) sử dụng touchesBegan: Phương pháp

đồ thị này giải thích thiết lập hiện tại của tôi với nhiều bong bóng:

enter image description here

Code:

@implementation Bubble 
... 
-(id) initWithFrame: (CGRect) frame { 
    UITapGestureRecognizer *singleFingerDTap = [[UITapGestureRecognizer alloc] 
               initWithTarget:self action:@selector(handleSingleTap:)]; 
    singleFingerDTap.numberOfTapsRequired = 1; 
    [self addGestureRecognizer:singleFingerDTap]; 

} 

-(void) handleSingleTap { 
NSLog(@"Bubble tapped, show the view"); 
} 

cho Square

@implementation Square 
... 
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
NSLog(@"square touched, lets hide the view"); 
} 

Sau một Tap tôi nhìn thấy cả hai NSLogs trên console

+0

pls bao gồm mã –

+0

@ mẫu mã LithuT.V bao gồm – perrohunter

Trả lời

3

Tôi đã tìm thấy sự cố là gì. UIView kế thừa từ UIResponder và các sự kiện chạm cơ bản được phát hiện bởi chế độ xem kích hoạt các lần chạm đã bắt đầu sự kiện. Các bản xem trước mà bạn đã thêm trong chế độ xem chính cũng phản hồi các thao tác đã bắt đầu phương pháp.Điều đó rất cơ bản. Bạn cũng đã thêm phương thức chọn bằng công cụ nhận dạng cử chỉ nhấn. Vì vậy, bất kỳ liên lạc trên bong bóng kích hoạt cả hai phương pháp và do đó hai bản ghi.Hãy thử thêm một nhận dạng cử chỉ để xem với bộ chọn khác, như

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tappedOnBubble)]; 
    [self.bubbleView addGestureRecognizer:tap]; 

UITapGestureRecognizer *tap2 = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tappedOnMainView)]; 
    [self.view addGestureRecognizer:tap2]; 


-(void)tappedOnMainView 
{ 
    NSLog(@"touched on main View"); 
    [self.vwToShow setHidden:NO]; 
} 
-(void)tappedOnView 
{ 
    NSLog(@"tapped on bubbleview"); 
    [self.vwToShow setHidden:YES]; 
} 
5

Vâng, đó là vấn đề. touchesBegan sẽ nhận được tất cả các thao tác chạm, bao gồm cả những thao tác được thực hiện bởi trình nhận dạng cử chỉ. Bạn có thể thử đặt gestureRecognizer.cancelsTouchesInView = TRUE hoặc sử dụng chạm vàoBấm cho bong bóng của bạn.

Vì có vẻ như bạn đang tạo trò chơi ở đây, bạn có đang sử dụng một số công cụ như cocos2D không? Nếu đó là trường hợp, có những cách dễ dàng hơn để thực hiện những gì bạn muốn.

Hy vọng điều này sẽ hữu ích.

Chúc mừng!

EDIT:

Nếu bạn đang sử dụng chỉ recognizers cử chỉ, các liên lạc sẽ không được gửi đến các quan điểm tiếp theo trong hệ thống phân cấp. Tôi nghĩ rằng đây là những gì bạn muốn. Nếu bạn quyết định đi với chạm bắt đầu tôi nghĩ rằng bạn nên làm một cái gì đó như thế này:

// trong lớp xem bong bóng

- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event 
{ 
    if(theTouchLocation is inside your bubble) 
    { 
     do something with the touch 
    } 
    else 
    { 
     //send the touch to the next view in the hierarchy (your large view) 
     [super touchesBegan:touches withEvent:event]; 
     [[self nextResponder] touchesBegan:touches withEvent:event]; 
    } 
} 
+0

câu trả lời tuyệt vời! Tôi nghĩ rằng tôi cũng có thể thay đổi Quảng trường để sử dụng chức năng nhận dạng cử chỉ, tuy nhiên có cách nào để ngăn sự kiện chuyển sang nextResponder từ bong bóng không ?? – perrohunter

+0

PS: không phải là một trò chơi: p – perrohunter

1

Làm điều này:

@implementation Square{ 

... 
-(id) initWithFrame: (CGRect) frame { 
    UITapGestureRecognizer *singleFingerDTap = [[UITapGestureRecognizer alloc] 
               initWithTarget:self action:@selector(handleSingleTap:)]; 
    singleFingerDTap.numberOfTapsRequired = 1; 
    [self addGestureRecognizer:singleFingerDTap]; 

} 

-(void) handleSingleTap { 
    NSLog(@"Sqaure tapped, hide the view"); 
} 

} 
+0

Chúng không phải là nút :) chúng là tùy chỉnh của UIView – perrohunter

0

Tại sao không sử dụng một vòi nước người nhận dạng cử chỉ trên chế độ xem chính? Cảm giác bắt đầu giống như viết trình nhận dạng cử chỉ của riêng bạn, nhưng khó hơn nhiều. Với nhiều trình nhận dạng nhấn, chỉ một người nhận sẽ kích hoạt.

+0

Tôi có cần yêu cầu Công cụ nhận dạng Square thất bại từ các bong bóng hoặc ngược? – perrohunter

+1

@ PERR0_HUNTER Đôi khi bạn nên tự mình thử thay vì đợi người khác nói với bạn. –

Các vấn đề liên quan