2015-10-24 2 views
1

Update:

я провел дальнейшие эксперименты и, как выясняется, я ошиблась о решении рабочего для UIWebView. Я проверил его, но не выглядел достаточно близко, я думаю. После размышления над комментариями мата и повторного чтения «решения», которое я нашел/упомянул, я заметил, что они не говорили о веб-просмотрах. С тех пор я взломал решение, которое встраивает мой UIWebView внутри моего собственного UIScrollView. Затем я отключу «прокрутку» UIWebView, установив размер и размер содержимого на весь HTML-документ. Этот подход должен работать либо для UIWebView, либо для WKWebView. Как только я очищу решение, я вернусь и обновлю.Limit прокручивать область в пределах содержания WKWebView

Оригинал:

Я разрабатываю приложение IOS, которая имеет WKWebView для чтения содержимого HTML. Иногда мне нужно иметь возможность ограничивать прокрутку в определенной части веб-контента. Например, скажем, что веб-контент составляет 10 000 точек по вертикали, и я хочу ограничить прокрутку между 5000 и 8000. Я всегда показываю всю ширину.

Я нашел это решение для UIWebView: https://stackoverflow.com/a/3973649

Решение предлагает установив webview.scrollView.contentSize как:

CGSize desiredContentSize = CGSizeMake(self.webView.scrollView.contentSize.width, 
             8000-5000); 
self.webView.scrollView.contentSize = desiredContentSize; 

и регулируя происхождение webview.scrollView.frame «с до -5000;

CGRect scrollFrame; 
scrollFrame.origin = CGPointMake(0, -5000); 
scrollFrame.size = self.webView.frame.size; 
self.webView.scrollView.frame = scrollFrame; 

Я нашел, что это хорошо работает с UIWebView, но он не работает с WKWebView. С WKWebView, я замечаю, что contentSize scrollView автоматически сбрасывается, чтобы соответствовать содержимому каждый раз, когда пользователь прокручивает страницу или когда JavaScript обновляет содержимое. Это не произошло с UIWebView.

я обнаружил, что могу «силы» нужный мне contentSize на «палки» с этим решением: https://stackoverflow.com/a/8214325/3352624

К сожалению, это вызывает испуг, когда я попал в верхней и нижней части видимой области. Использование этого подхода KVO заключается в том, как я заметил, что WKWebView постоянно перезагружает его contentSize.

Как можно прокрутить область WKWebView? Есть ли хороший способ предотвратить изменение ContentSize?

Для чего это, в данном случае, содержимое HTML контролируется контентом из внутреннего API. Единственный запуск javascript - мой собственный. Я нацелен на iOS 8 и 9.

+0

Поскольку это ваш контент и ваш JavaScript, почему бы вам не сделать это правильно и просто удалить часть содержимого, которое вы не хотите видеть у пользователя? – matt

+0

@matt Хорошая точка. Границы, которые я размещаю, окружают, предлагая ежедневные чтения. У меня есть еще одно требование разрешить пользователю передавать эти границы с расширенным жестом тяги. Материал за пределами границы должен быть видимым во время этого жеста. Если они вытянут достаточно далеко, я перемещу границы в следующий раздел. Во-вторых, я использую rangy javascript-библиотеку для выделения, и я уверен, что это испортит сериализацию. – davew

+0

Хороший ответ. Но моя точка зрения остается: вы станете намного более счастливым кемпером, если вы реализуете эту функцию с помощью css-and-javascript и не пытаетесь подорвать сам веб-просмотр. Это просто взгляд, и он не настроен на то, что вы пытаетесь сделать. – matt

ответ

0

Если вы хотите ограничить область прокрутки в wkwebview, это не очень хорошая идея, попробуйте изменить вставку или фрейм содержимого (худшее) веб-представления и хорошо ... javascript инъекционные растворы могут не работать.

Это потому, что секрет плавного прокрутки веб-представления заключается в том, что он загружает все тело, это позволяет вам исследовать это полное тело через естественный вид прокрутки, включенный как subview в веб-представление, позволяя вам увидеть полное тело которая пропорциональна размеру веб-представления (она работает лучше, чем использование, например, инъекции контейнера, который устанавливает стиль переполнения в «прокрутке»).

Основываясь на последнем объяснении и в вашем примере:.

«Я разрабатываю приложение IOS, которая имеет WKWebView для чтения контента HTML Иногда мне нужно нужно, чтобы иметь возможность ограничивать прокрутки в пределах определенного участка веб-контента, например, скажем, что веб-контент составляет 10 000 точек по вертикали, и я хочу ограничить прокрутку между 5000 и 8000. Я всегда показываю всю ширину ».

Решение будет:

CGFloat topScrollLimit = 5000, bottomScrollLimit = 8000; 
CGFloat contentHeight = myWebView.scrollView.contentSize.height; //10000 
myWebView.scrollView.contentInset = UIEdgeInsetsMake(topScrollLimit*-1.0f, 0, (contentHeight-bottomScrollLimit)*-1.0f, 0); 

В дополнение, если вы хотите, чтобы предотвратить жест прокрутки превышать край предела вы можете добавить строку:

myWebView.scrollView.bounces = NO; 

Для других примеров с меньший размер или контент, меньший, чем высота веб-видимости, вероятно, вы должны уменьшить высоту веб-представления.

Смежные вопросы