2012-06-19 33 views
10

Tôi đã có phân cấp hình ảnh đó trông như thếDetect tap vào "khoảng trống" UIView của

UIScrollView 
| 
+- UIView 
    | 
    +- UITextField 
    +- UITextField 
    +- UIButton 

Những gì tôi muốn là cho người dùng mà khai thác một trong các trường văn bản và nhìn thấy bàn phím trên màn hình để có thể chạm vào "khoảng trống" của UIView để ẩn bàn phím. Vì vậy, tôi không muốn, ví dụ, một sự kiện từ UIButton để bong bóng lên đến UIView (đó là chính xác những gì sẽ xảy ra nếu tôi thêm UITapGestureRecognizer để UIView).

Làm cách nào để tôi có thể đạt được chức năng mong muốn?

Trả lời

22

Trong phương pháp viewDidLoad bạn thêm cử chỉ này nhận dạng:

UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)]; 
gestureRecognizer.cancelsTouchesInView = NO; 
[self.view addGestureRecognizer:gestureRecognizer]; 

Sau đó, thêm dismissKeyboard phương pháp:

- (void) dismissKeyboard{ 
    [YOURFIELDHERE resignFirstResponder]; 
} 

Bạn cũng cần để thêm video này để làm cho nó để các nút vẫn còn nhấp được và không ghi đè bởi trình nhận dạng cử chỉ:

gestureRecognizer.delegate = self; // in viewDidLoad 
<UIGestureRecognizerDelegate> //in your header file 

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 

    if ([touch.view isKindOfClass:[UIButton class]]){ 
    return NO; 
    } 
    return YES; // handle the touch 
} 
+0

Đại biểu của GestureRecognizer là thứ tôi chưa sử dụng. Thay vào đó, tôi sử dụng phân lớp ngớ ngẩn để xử lý các lần chạm, điều này có thể đã được thực hiện dễ dàng hơn rất nhiều. Cảm ơn bạn. – Eugene

+0

Tôi đã phạm sai lầm đó nhiều lần. Re-phát minh ra bánh xe, và không phải là rất thanh lịch ở đó, chỉ để tìm thấy có một phương pháp đại biểu đã làm những gì tôi muốn thậm chí còn tốt hơn so với tôi đã quản lý để thực hiện. Đó là một sự sụp đổ thực sự của tài liệu của Apple, theo ý kiến ​​của tôi. –

+0

Câu trả lời hay! Cảm ơn nhiều! – HiveHicks

1

Tôi gặp phải vấn đề tương tự này và giải quyết nó bằng một giải pháp ngây thơ.

  1. Thay đổi chế độ xem từ trường hợp UIView thành phiên bản UIControl để nó có thể xử lý các sự kiện chạm.
  2. Tạo phương thức IBAction trong Trình điều khiển chế độ xem xử lý sự kiện chạm. Trong trường hợp này, chúng tôi sẽ từ chức bất kỳ phản hồi đầu tiên nào từ các bản xem trước của chế độ xem.

    - (IBAction)backgroundTapped:(id)sender { [contentView endEditing:YES]; }

    contentView chỉ là trường hợp biến trỏ đến các View. Bạn có thể đặt tên cho nó bất cứ điều gì bạn muốn. Khi bạn đã chuyển thông báo endEditing tới Chế độ xem, về cơ bản nó sẽ yêu cầu các bản xem trước của người đó từ chối phản hồi đầu tiên, do đó loại bỏ bàn phím.

  3. Kết nối mục tiêu (View) và hành động (phương pháp IBAction bạn vừa tạo) thông qua giao diện Builder, bằng cách mở connection inspector của View, chọn Touch Up Inside và kéo nó vào đối tượng Chủ đầu tư của File, sau đó chọn tên của phương pháp này .

Hy vọng điều đó sẽ hữu ích.

1

Tôi biết đó là một chút trễ, nhưng một giải pháp đơn giản nhanh chóng như sau:

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

    [self.view endEditing:YES]; 
} 

Nó được gọi nếu bạn gõ vào bất kỳ không gian trống rỗng.

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