Tôi đang hiển thị tài liệu trong giao diện người dùng UIWebView. Tôi muốn đặt một điểm nóng trên tài liệu để kích hoạt một hành động khi nó được khai thác, nhưng tôi cũng muốn duy trì hành vi UIWebView mặc định của tự động phóng to tài liệu khi nó được khai thác hai lần. Tôi không thể tìm ra cách để phản ứng với các lần chạm đơn lẻ trong khi cho phép UIWebView phản hồi với các thao tác nhấn đúp.Làm cách nào để chỉ phản hồi cử chỉ chạm một lần trong khi để các đối tượng phía sau phản ứng với các thao tác nhấn đúp?
Lần đầu tiên tôi thiết lập điểm phát sóng là UIButton trong suốt với hành động, nhưng nhấn đúp vào điểm phát sóng dẫn đến hành động điểm phát sóng được gọi hai lần. Vì vậy, tôi đã xóa hành động khỏi nút và đã đính kèm một cử chỉ nhấn một lần để thay thế:
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapAction:)];
singleTap.numberOfTapsRequired = 1;
singleTap.delegate = self;
[self.hotspot addGestureRecognizer:singleTap];
[singleTap release];
Điều này hoạt động giống như thao tác nút thông thường. Nhưng sau đó tôi đã tạo ra một cử chỉ nhấn đúp, và cấu hình nó để chặn các cử chỉ đơn-tap với requireGestureRecognizerToFail:
UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(zoomWebView:)];
doubleTap.numberOfTapsRequired = 2;
doubleTap.delegate = self;
[self.hotspot addGestureRecognizer:doubleTap];
[doubleTap release];
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapAction:)];
singleTap.numberOfTapsRequired = 1;
[singleTap requireGestureRecognizerToFail:doubleTap];
singleTap.delegate = self;
[self.hotspot addGestureRecognizer:singleTap];
[singleTap release];
- (void)zoomWebView:(UITapGestureRecognizer *)gesture {
NSLog(@"double tap");
}
Với thiết lập này, một đơn-tap trên hotspot gọi singleTapAction và nhấp đúp vào hotspot gọi zoomWebView (một phương thức tùy chỉnh). Điều này là tốt bởi vì singleTapAction không còn được gọi hai lần nữa, nhưng không tốt vì UIWebView không còn đáp ứng với việc nhấn đúp nữa.
Tôi đã thử chuyển tiếp sự kiện nhấn đúp từ cử chỉ doubleTap của tôi tới UIWebView bằng cách phân lớp UITapGestureRecognizer, ghi đè chạm vàoBegan và chạm vào Phương thức được gửi và gửi đối số của chúng đến phương thức tương ứng của UIWebView. Khi tôi đã làm điều đó, tôi có thể thấy rằng lớp con của tôi đã nhận được các sự kiện, nhưng UIWebView không trả lời các sự kiện được chuyển tiếp. Điều này được mong đợi bởi vì Event Handling Guide for iOS nói rằng chúng ta chỉ có thể chuyển tiếp các sự kiện tới các lớp con tùy chỉnh của UIView, chứ không phải các đối tượng khung công tác UIKit.
Có cách nào để ngăn cử chỉ chạm một lần của tôi khỏi phản hồi các lần nhấn đúp không chuyển hướng các sự kiện nhấn đúp không? Điều này có vẻ như một yêu cầu cơ bản, nhưng tôi không thể nhìn thấy một cách đơn giản để làm điều đó. Tôi đã đọc và thử nghiệm với số touch delivery properties của UIGestureRecognizer, nhưng không có sự kết hợp nào giữa các giá trị đã dừng cử chỉ chạm một lần từ việc sử dụng cử chỉ nhấn đúp.
Nhân tiện, mối quan hệ giữa điểm phát sóng và UIWebView trong cấu trúc phân cấp của tôi là "anh em họ" - chúng là các bản xem trước của hai chế độ xem anh chị em. Nếu tôi thêm công cụ nhận dạng cử chỉ vào chế độ xem điểm phát sóng, chế độ xem web hoặc chế độ xem "ông bà" của họ, tôi sẽ nhận được kết quả tương tự.
không chắc về vấn đề này (vì thế nó trở thành một bình luận), nhưng bạn không thể thêm một vòi cử chỉ duy nhất để UIWebView? –
@DeanPucsek Tôi đã làm điều đó một lúc và nó hoạt động khi hiển thị tài liệu PDF. Nhưng nếu nội dung được hiển thị trong UIWebView là HTML hoặc JPG, UIWebView sẽ chụp một lần cho các hành động của riêng nó và Trình nhận dạng UIGestureRecognizer không nhận được sự kiện. Sẽ thuận tiện hơn khi xử lý việc này với chế độ xem điểm phát sóng, nhưng tôi có thể quay lại phương pháp này nếu tôi có thể làm cho nó hoạt động với tất cả các loại nội dung UIWebView. – arlomedia