Отключить прокрутку в UIWebView разрешено?


91

Я должен показать веб-статью с пометкой UITableViewпод статьей.

Единственный вариант, который я нашел, - это отобразить статью в UIWebViewзаголовке tableView.

Для этого мне нужно получить высоту содержимого webView и отключить прокрутку для webView.

Я нашел два решения для отключения прокрутки:

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

или в JavaScript:

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

Я слышал, что первое решение запрещено Apple, но у меня нет никаких доказательств этого. Будет ли моя заявка отклонена при использовании этого решения? Если да, могу ли я использовать второе решение без отказа?

Ответы:


298

Начиная с iOS5 у нас есть прямой доступ к прокрутке UIWebView.
Вы можете отключить прокрутку и отскоки следующим образом:

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

3
Большое спасибо, это именно то, что я искал. @jsddour, отметьте этот ответ как принятый!
marcgg

По какой-то причине у меня это не работает. :-( Я поместил ScrollView и поместил в него UIWebView. Затем установите указанные выше 2 строки в методе viewWillAppear. Но прокрутка по-прежнему работает в веб-представлении. Может ли кто-нибудь помочь? Просто для информации, я запускаю его в Симулятор iOS 7.
Amogh Natu

что толку webView.scrollView.bounces = NO;? поскольку код в первой строке отключил прокрутку.
Gon

1
Обожаю, когда люди берут ответ и бегут, не тратя времени на то, чтобы проголосовать за автора. Нет ли способа уведомить пользователя, чтобы он выбрал ответ для голосования?
Джон Коган,

1
для быстрого webView.scrollView.scrollEnabled = false / webView.scrollView.bounces = false
Чатуранга Сильва,

26

Поскольку этот вопрос по-прежнему актуален, есть новый способ сделать это! (iOS 7.0+, возможно, iOS 6, не подтверждено)

webView.scrollView.scrollEnabled = NO;

Береги себя :)


Я не понимаю, почему этого нет в IB: /, давай, APPLE, что ты делаешь! Тем не менее, очень хорошее решение!
Махмуд Ахмад

20

Вы можете просто установить для свойства взаимодействия с пользователем веб-просмотр значение no, т.е.

webView.userInteractionEnabled = NO;

Это довольно просто и отлично работает, спасибо :)


28
Однако это предотвращает переход по ссылкам.
Грэм Перкс

@GrahamPerks Я отредактировал ответ относительно вашего комментария, просмотрите его и одобрите, спасибо :)
Эшвар Чайтанья

12

для всех версий ios вы можете использовать этот код вместо setScrollEnabled:

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

Во-первых, я пробую метод setScrollEnabled, и яблоко отклоняет мой ipa. Затем я изменил этот метод и согласился.
mturhan55



7

Я думаю, что Javascript

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

это лучшее решение.

На самом деле :

Ваш первый экзамен, или

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

one (то же самое) может быть отклонено, потому что не задокументировано, или может привести к сбою вашего приложения при следующем обновлении ios.

И

[[myWebView scrollView] setBounces:NO];

не будет работать с iOS <5.


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

это решило для меня


4
Было бы неправильно полагаться на это, поскольку это не открытый API.
Deepak Danduprolu

[[[Подпредставления WebView] lastObject] setScrollingEnabled: NO]; это решило для меня. Во всяком случае, это не ответ на мой вопрос. Мой вопрос: мне разрешено это делать? Вроде отключение прокрутки SDK запрещено. Но я не уверен. А насчет отключения прокрутки javascript.
jsaddour

Нет никаких доказательств того, что мое предложение вызовет отклонение со стороны Apple, фактически, путем вызова последнего subview в массиве subviews и установки scrollingEnabled против его открытого API? конечно ?. и да, сделайте это, потому что вы можете его использовать. нет идеи через javascript. извиняюсь.
theiOSDude

3
Нет, не надо этого делать. Как говорит Дипак, нельзя полагаться на недокументированный внутренний порядок подпредставлений в одном из элементов пользовательского интерфейса Apple. Если они изменят внутреннюю структуру в будущем обновлении ОС, ваше приложение выйдет из строя. Они специально предупреждают об этом в нескольких местах, и многие приложения перестали работать при обновлении до iPhone OS 3.0 только потому, что они это сделали.
Брэд Ларсон



4

Я не думаю, что Apple запрещает первый вариант.

Вы могли бы попробовать

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

Если вы не хотите, чтобы какие-либо ссылки работали в вашем UIWebView, вы также можете сделать

[myWebView setUserInteractionEnabled:NO];



3

Я поместил несколько UIWebViews внутрь a, UIScrollViewи он не прокручивался для меня, если я не отключил взаимодействие с пользователем в веб-просмотрах (даже с помощью [[webview scrollview] setScrollEnabled:NO]). Итак, я поместил UIWebViews внутрь a, UIViewи это сработало для меня, но затем интерактивные ссылки или div в моем HTML внутри больше UIWebViewне работали.

Единственное, что сработало для меня, - это сохранить UIWebViewвнутреннюю часть, UIScrollViewчтобы взаимодействие HTML работало, а UIScrollingне - нет.

Затем я создал настраиваемого делегата для просмотра веб-страниц, window.open("http:/customEvent")который вызывается из HTML-кода, содержащегося в веб-просмотре. Я также добавил обнаружение смахивания JavaScript, которое запускает мое пользовательское событие.

Когда делегат webview получает это, я передаю уведомление контроллеру, который затем динамически прокручивает мои UIScrollView. Очевидно, мне пришлось создать логику для отслеживания и прокрутки к следующей или предыдущей странице. Не самое красивое решение, но оно работает для меня.


3

Попробуйте это в своем HTML ( <HEAD>теге)

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

Это отключит прокрутку на вашей веб-странице.

(работает на любой веб-странице, а не только на UIWebView)


2

Мне нужно было отключить прокрутку, потому что отключение настраиваемой клавиатуры действительно испортило прокрутку с помощью webView. Больше ничего не работало, и я прибег к примерно такому:

-(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

Являются ли UIWebview и UITableView в UIScrollview и установка высоты веб-просмотра (и добавление к общему ContentSize Scrollview) как то, что вы хотите?


Почти. Но кажется менее сложным отображать WebView в заголовке tableView. Но мой вопрос: мне разрешено отключить прокрутку webView через SDK? Если нет, мне разрешено делать это через javascript?
jsaddour

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

1
он будет работать до обновления, в котором изменится место просмотра прокрутки
Мартин,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.