Tắt Scroll trên UIWebView được phép?


90

Tôi phải hiển thị một bài báo trên web với một UITableViewbài báo bên dưới.

Tùy chọn duy nhất tôi tìm thấy là hiển thị bài báo trong UIWebViewtiêu đề tableView.

Để làm được điều đó, tôi phải lấy chiều cao của nội dung webView và tôi phải tắt tính năng cuộn cho webView.

Tôi đã tìm thấy hai giải pháp để tắt tính năng cuộn:

for (id subview in webView.subviews)
    if ([[subview class] isSubclassOfClass: [UIScrollView class]])
        ((UIScrollView *)subview).scrollEnabled=NO;

hoặc trong JavaScript:

<script type="text/javascript">
touchMove = function(event) {
    event.preventDefault();
}

Tôi nghe nói rằng giải pháp đầu tiên bị Apple cấm nhưng tôi không có bất kỳ bằng chứng nào về nó. Ứng dụng của tôi có bị từ chối khi sử dụng giải pháp này không? Nếu vậy, tôi có thể sử dụng giải pháp thứ hai mà không bị từ chối không?

Câu trả lời:


297

Bắt đầu với iOS5, chúng tôi có quyền truy cập trực tiếp vào chế độ xem cuộn của UIWebView.
Bạn có thể tắt cuộn và trả lại như sau:

webView.scrollView.scrollEnabled = NO; 
webView.scrollView.bounces = NO;

3
cảm ơn rất nhiều, đó chính xác là những gì tôi đang tìm kiếm. @jsddour, bạn nên đánh dấu câu trả lời này là được chấp nhận!
marcgg

Vì một số lý do, điều này không hiệu quả với tôi. :-( Tôi đã đặt ScrollView và đã đặt UIWebView trong đó. Sau đó đặt 2 dòng trên trong phương thức viewWillAppear. Nhưng cuộn vẫn hoạt động ở chế độ xem web. Ai đó có thể giúp gì không? Chỉ để biết thông tin, tôi đang chạy nó trong Trình mô phỏng iOS 7.
Amogh Natu

việc sử dụng là webView.scrollView.bounces = NO;gì? vì mã ở dòng đầu tiên đã tắt tính năng cuộn.
Gon

1
Thích thú khi mọi người đưa ra câu trả lời và chạy mà không cần dành thời gian để cho người đóng góp một phiếu bầu. Không có cách nào để thông báo cho người dùng vui lòng chọn một câu trả lời để bình chọn?
John Cogan

1
cho nhanh chóng webView.scrollView.scrollEnabled = false / webView.scrollView.bounces = false
Chathuranga Silva

26

Vì câu hỏi này vẫn có thể áp dụng, nên có một cách mới để làm điều đó! (iOS 7.0+, có lẽ cả iOS 6, chưa được xác nhận)

webView.scrollView.scrollEnabled = NO;

Bảo trọng :)


Điều tôi không hiểu là tại sao điều đó không có trong IB: /, cmon APPLE bạn đang làm gì! Tuy nhiên, giải pháp rất hay!
Mahmud Ahmad

20

Bạn chỉ cần đặt thuộc tính tương tác người dùng của chế độ xem web thành không

webView.userInteractionEnabled = NO;

Nó khá đơn giản và hoạt động tốt, cảm ơn :)


28
Tuy nhiên, điều này ngăn các liên kết bị khai thác.
Graham Perks

@GrahamPerks Tôi đã chỉnh sửa câu trả lời đối với nhận xét của bạn, vui lòng xem xét nó và chấp thuận, cảm ơn :)
Eshwar Chaitanya

12

đối với tất cả các phiên bản ios, bạn có thể sử dụng mã này thay vì setScrollEnabled:

for (UIView *view in webview.subviews) {
    if ([view isKindOfClass:[UIScrollView class]]) {
       UIScrollView *scrollView = (UIScrollView *)view;
       scrollView.scrollEnabled = NO;
    }
}

đầu tiên, tôi thử phương pháp "setScrollEnabled" và apple đã từ chối ipa của tôi. Sau đó, tôi đã thay đổi phương pháp này và chấp nhận.
mturhan55

12

Sử dụng cái này <body ontouchmove="event.preventDefault()">


10

Phiên bản SWIFT 3

    webView.scrollView.bounces = false
    webView.scrollView.isScrollEnabled = false

7

Tôi nghĩ Javascript

<script type="text/javascript">
touchMove = function(event) {
event.preventDefault();
}

cho đến nay là giải pháp tốt nhất.

Thật :

Bài kiểm tra đầu tiên của bạn, hoặc

[[[WebView subviews] lastObject] setScrollingEnabled:NO];

một (những thứ tương tự) có thể bị từ chối vì không được ghi lại hoặc khiến ứng dụng của bạn gặp sự cố trong một bản cập nhật ios khác.

[[myWebView scrollView] setBounces:NO];

phương pháp sẽ không hoạt động với iOS <5.


5
[[[WebView subviews] lastObject] setScrollingEnabled:NO];

đã sắp xếp nó cho tôi


4
Sẽ rất sai lầm nếu dựa vào điều này vì nó không phải là một API được tiếp xúc.
Deepak Danduprolu

[[[WebView subviews] lastObject] setScrollingEnabled: NO]; đã sắp xếp nó cho tôi. Dù sao, nó không trả lời câu hỏi của tôi. Câu hỏi của tôi là tôi có được phép làm điều đó không? Có vẻ như việc tắt cuộn qua SDK bị cấm. Nhưng tôi không chắc. Và những gì về việc vô hiệu hóa cuộn qua javascript.
jsaddour

không có bằng chứng nào cho thấy đề xuất của tôi sẽ gây ra sự từ chối bởi apple, infact, bằng cách gọi subiew cuối cùng trong mảng subviews và đặt scrollingEnabled chống lại nó là API bị lộ? chắc chắn ?. và bạn có thể sử dụng nó. không có ý tưởng thông qua javascript mặc dù. lấy làm tiếc.
theiOSDude

3
Không, bạn không nên làm điều này. Như Deepak nói, bạn không thể dựa vào thứ tự nội bộ không có giấy tờ của các lượt xem phụ trong một trong các phần tử giao diện người dùng của Apple. Nếu họ thay đổi cấu trúc bên trong trong bản cập nhật hệ điều hành trong tương lai, ứng dụng của bạn sẽ bị lỗi. Họ đặc biệt cảnh báo về việc thực hiện điều này ở nhiều nơi và nhiều ứng dụng đã bị hỏng khi nâng cấp lên iPhone OS 3.0 chỉ vì họ đã làm điều này.
Brad Larson



4

Tôi không nghĩ rằng tùy chọn đầu tiên bị Apple cấm.

Bạn có thể thử

[[[Webview subviews] lastObject] setScrollingEnabled:NO];

Nếu bạn không muốn bất kỳ liên kết nào hoạt động trong UIWebView của mình, bạn cũng có thể

[myWebView setUserInteractionEnabled:NO];

4

Sử dụng nó :

[[webView scrollView] setBounces:NO];
[[webView scrollView] setScrollingEnabled:NO];

3

Thử cái này,

[(UIScrollView *)[[webView subviews] lastObject] setScrollEnabled:NO];    

3

Tôi đã đặt một số UIWebViewký tự bên trong a UIScrollViewvà nó không cuộn đối với tôi, trừ khi tôi vô hiệu hóa tương tác của người dùng trên các lần xem web (ngay cả với [[webview scrollview] setScrollEnabled:NO]). Vì vậy, tôi đã đặt các UIWebViews bên trong a UIViewvà điều đó phù hợp với tôi nhưng sau đó các liên kết hoặc div tương tác trong HTML của tôi bên trong UIWebViewkhông hoạt động nữa.

Điều duy nhất phù hợp với tôi là giữ cho UIWebViewbên trong các UIScrollViewtương tác HTML hoạt động nhưngUIScrolling không.

Sau đó, tôi đã tạo một đại biểu tùy chỉnh cho window.open("http:/customEvent")các chế độ xem web để nghe nó được gọi từ HTML có trong chế độ xem web. Tôi cũng đã thêm một phát hiện vuốt JavaScript sẽ kích hoạt sự kiện tùy chỉnh của tôi.

Khi người được ủy quyền webview nhận được thông báo này, tôi chuyển một thông báo đến bộ điều khiển, sau đó sẽ cuộn động của tôi UIScrollView. Rõ ràng là tôi đã phải xây dựng một logic để theo dõi và cuộn đến trang tiếp theo hoặc trước đó. Không phải là giải pháp tốt nhất nhưng nó đang hiệu quả với tôi.


3

Hãy thử điều này trong HTML ( <HEAD>thẻ) của bạn

<script> 
  document.ontouchmove = function(event) { event.preventDefault(); }
</script>

Nó sẽ tắt tính năng cuộn trên trang web của bạn.

(hoạt động trên bất kỳ trang web nào, không chỉ UIWebView)


2

Tôi cần tắt tính năng cuộn vì việc loại bỏ bàn phím tùy chỉnh thực sự làm rối tung việc cuộn với webView. Không có gì khác hoạt động và tôi đã sử dụng một cái gì đó như thế này:

-(void)viewDidLoad{
  [super viewDidLoad];
  [self.webView.scrollView addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:nil];
  self.webView.scrollView.showsVerticalScrollIndicator = NO;
}  

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
    if (!CGPointEqualToPoint(self.webView.scrollView.contentOffset, CGPointZero)){
        self.contentOffset = CGPointZero;
    }
}

1

Có phải UIWebview và UITableView trên UIScrollview và đặt chiều cao của webview (và thêm vào tổng ContentSize của Scrollview) như những gì bạn muốn không?


Hầu hết. Nhưng có vẻ ít phức tạp hơn khi hiển thị WebView trong tiêu đề tableView. Nhưng câu hỏi của tôi là: Tôi có được phép tắt cuộn webView qua SDK không? Nếu không, tôi có được phép làm javascript hay không?
jsaddour

1
[[[WebView subviews] lastObject] setScrollingEnabled:NO];

1
nó sẽ hoạt động cho đến khi cập nhật nơi nơi xem cuộn sẽ thay đổi
Martin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.