2012-11-16 34 views
5

Tôi muốn đạt được những điều sau đây.Tạo UIView chụp các vòi nhưng minh bạch đối với tất cả các cử chỉ khác

Tình huống: Bàn phím iOS được bật trên màn hình trong khi người dùng đang nhập vào một trường văn bản cụ thể. Người dùng có thể nhấn bất kỳ nơi nào bên ngoài bàn phím và trường văn bản để loại bỏ bàn phím (mà không kích hoạt bất kỳ nút nào hiển thị). Ngoài ra, người dùng có thể kéo bên ngoài bàn phím và quan sát hành vi kéo bình thường trên một số sắp xếp các chế độ xem có thể cuộn.

Về mặt lý thuyết, tôi đặt một “bù đắp” UIView trên hầu hết các màn hình mà ứng xử như vậy:

  1. Nếu người dùng chạm trên trang bìa, sau đó tôi chụp tap đó (vì vậy mà tôi có thể , ví dụ, loại bỏ bàn phím). Điều này dễ thực hiện bằng cách chặn các sự kiện chạm trong lớp con UIView hoặc sử dụng trình nhận dạng cử chỉ nhấn.

  2. Nếu người dùng kéo trên bìa, sau đó nắp bỏ qua hoặc chuyển tiếp những chạm này; chúng được nhận bởi các lớp bên dưới giống như chúng không có nắp đậy.

Vì vậy: người dùng có thể cuộn nội dung bên dưới trang bìa, nhưng không nhấn vào nội dung bên dưới trang bìa. Một vòi nước "bên ngoài" của bàn phím và trường văn bản nên loại bỏ bàn phím (và bao gồm), nhưng không nên kích hoạt bất cứ điều gì.

Tôi làm cách nào để đạt được điều này?

+0

Bạn phải xem xét việc triển khai phương thức ủy nhiệm chạm và chuyển giao cho các giao diện phía sau nó để vuốt. '- (void) touchesBegan: (NSSet *) chạm với sự kiệnEvent: (UIEvent *) { [otherView touchesBegan: chạm vớiEvent: event]; } 'Một cách khác là triển khai, UIPanGestureRecognizer và đặt cancelsTouchesInView = YES là' UIPanGestureRecognizer * gr = [[UIPanGestureRecognizer alloc] initWithTarget: tự hành động: @selector (handlePan)]; [gr setCancelsTouchesInView: YES]; [myButton addGestureRecognizer: gr]; [phát hành gr]; ' – iDev

+1

@mjh, bạn đã bao giờ tìm thấy giải pháp cho điều này chưa? – kpozin

Trả lời

0

1: Thêm một recognizer tap cử chỉ đến xem:

//Adding tap gesture 
    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapGesture:)]; 
    tapGesture.numberOfTapsRequired = 1; 
    [self.view addGestureRecognizer:tapGesture]; 

2: Trong handleTapGesture bạn resignFirstResponder của bàn phím

- (void)handleTapGesture:(UITapGestureRecognizer *)sender { 
    if (sender.state == UIGestureRecognizerStateRecognized) { 
     //Resign first responder for keyboard here 
    } 
} 

xây dựng một chút về câu trả lời ở trên. UIGestureRecognizerStateRecognized đảm bảo đó là các sự kiện tab đơn được nhận dạng.

Đây có phải là chức năng mà bạn sau này không?

+0

Câu hỏi của ông là "nếu người dùng kéo trên trang bìa, thì bìa bỏ qua tất cả các chạm; chúng được nhận bởi các lớp bên dưới giống như chúng không có nắp đậy". Anh ta đã tìm ra cách phát hiện cảm ứng. – iDev

+0

Nếu 'UIView' có thể nhận dạng các vòi, thì' .userInteractionEnabled' của nó phải là 'YES' và do đó nó ăn tất cả các sự kiện cảm ứng, ngăn cản việc kéo được nhận ra bởi bất kỳ điều gì bên dưới. – mjh

2

Thêm vòi cử chỉ theo cách thông thường:

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

Nhưng những gì bạn có thể tìm kiếm này là:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
    {  
     return YES; 
    } 

Tài liệu cho biết: Phương pháp này được gọi khi công nhận một cử chỉ bởi một trong hai gestureRecognizer hoặc otherGestureRecognizer sẽ chặn trình nhận dạng cử chỉ khác nhận ra cử chỉ của nó. (https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIGestureRecognizerDelegate_Protocol/index.html#//apple_ref/occ/intf/UIGestureRecognizerDelegate)

Bằng cách này, bạn có thể chắc chắn rằng nó hoàn toàn minh bạch và cũng không có gì ngăn cản trình nhận dạng của bạn bị gọi.

0

Một giao diện tùy chỉnh mà sẽ chuyển tất cả chạm mà nó nhận được:

class CustomView: UIView { 

    override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? { 

     var hitView = super.hitTest(point, withEvent: event) 

     if hitView == self { 
      return nil 
     } 

     return hitView 
    }  
} 

Từ đó bạn có thể đi theo con đường khác nhau để chỉ tận dụng những cử chỉ tap. Hoặc là quan sát UIEvent để có thể chạm vào nó, hoặc sử dụng bộ nhận dạng cử chỉ.

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