Tôi đã thử một cách tiếp cận hơi khác để ngăn các đối tượng UIWebView cuộn và nảy: thêm một trình nhận dạng cử chỉ để ghi đè các cử chỉ khác.
Dường như, UIWebView hoặc chương trình phụ của trình điều khiển cuộn của nó sử dụng trình nhận dạng cử chỉ pan riêng để phát hiện cuộn người dùng. Nhưng theo tài liệu của Apple, có một cách hợp pháp để ghi đè một trình nhận dạng cử chỉ này với một trình nhận dạng cử chỉ khác. Giao thức UIGestureRecognizerDelegate có một phương thức cử chỉ phương thức : nênRecognizeSim đồng thờiWithGestureRecognizer: - cho phép kiểm soát hành vi của bất kỳ nhận dạng cử chỉ va chạm nào.
Vì vậy, những gì tôi đã làm là
trong phương thức viewDidLoad của trình điều khiển xem:
// Install a pan gesture recognizer // We ignore all the touches except the first and try to prevent other pan gestures
// by registering this object as the recognizer's delegate
UIPanGestureRecognizer *recognizer;
recognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanFrom:)];
recognizer.delegate = self;
recognizer.maximumNumberOfTouches = 1;
[self.view addGestureRecognizer:recognizer];
self.panGestureFixer = recognizer;
[recognizer release];
Sau đó, phương thức ghi đè cử chỉ:
// Control gestures precedence
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
// Prevent all panning gestures (which do nothing but scroll webViews, something we want to disable in
// the most painless way)
if ([otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]])
{
// Just disable every other pan gesture recognizer right away
otherGestureRecognizer.enabled = FALSE;
}
return NO;
}
Tất nhiên, phương thức ủy nhiệm này có thể giúp tôi phức tạp hơn trong một ứng dụng thực tế - chúng tôi có thể vô hiệu hóa các trình nhận dạng khác một cách chọn lọc, phân tích otherGestureRecognizer.view và đưa ra quyết định dựa trên quan điểm của nó.
Và cuối cùng, để hoàn thiện, phương pháp chúng tôi đã đăng ký như một trình xử lý pan:
- (void)handlePanFrom:(UIPanGestureRecognizer *)recognizer
{
// do nothing as of yet
}
nó có thể trống nếu tất cả những gì chúng ta muốn là hủy cuộn và nảy của chế độ xem web hoặc nó có thể chứa mã riêng của chúng ta để thực hiện loại chuyển động pan và hoạt hình mà chúng ta thực sự muốn ...
Cho đến nay tôi chỉ đang thử nghiệm tất cả những thứ này, và nó dường như đang hoạt động ít nhiều như tôi muốn. Mặc dù vậy, tôi chưa thử gửi bất kỳ ứng dụng nào cho iStore. Nhưng tôi tin rằng tôi đã không sử dụng bất cứ thứ gì không có giấy tờ cho đến nay ... Nếu có ai tìm thấy nó khác, xin vui lòng thông báo cho tôi.