Вимкнути прокрутку на UIWebView дозволено?


90

Я повинен показати веб-статтю з 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, але я не маю жодних доказів цього. Чи буде відхилено мою заявку за допомогою цього рішення? Якщо так, чи можу я використовувати друге рішення, не відхиляючи?

Відповіді:


297

Починаючи з iOS5, ми маємо прямий доступ до перегляду прокрутки UIWebView.
Ви можете вимкнути прокрутку та відскоки таким чином:

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

3
велике спасибі, саме це я шукав. @jsddour, слід позначити цю відповідь як прийняту!
marcgg

Чомусь це не працює для мене. :) Симулятор iOS 7.
Amogh Natu,

яка користь webView.scrollView.bounces = NO;? оскільки код у першому рядку відключив прокрутку.
Гон

1
Полюбляйте, коли люди беруть відповідь і бігають, не витрачаючи часу, щоб дати учаснику право голосу. Чи немає жодного способу повідомити користувача про вибір відповіді для голосування?
Джон Коган,

1
for swift webView.scrollView.scrollEnabled = false / webView.scrollView.bounces = false
Чатуранга Сільва

26

Оскільки це питання все ще застосовується, існує новий спосіб це зробити! (iOS 7.0+, можливо, iOS 6 також, не підтверджено)

webView.scrollView.scrollEnabled = NO;

Піклуватися :)


Я не розумію, чому цього немає в IB: /, cmon APPLE, що ти робиш! Тим не менше, дуже приємне рішення!
Махмуд Ахмад

20

Ви можете просто встановити для властивості взаємодії користувача веб-перегляду значення no ie

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", і apple відхилив мій ipa. Потім я змінив цей метод і прийняв.
mturhan55



7

Думаю, Javascript

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

є найкращим рішенням.

Справді:

Ваш перший екзамен, або

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

одне (ті самі речі) може бути відхилено, оскільки це не задокументовано, або призведе до аварійного завершення роботи програми під час подальшого оновлення ios.

І

[[myWebView scrollView] setBounces:NO];

метод не працює з iOS <5.


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

що для мене це відсортувало


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

[[[WebView subviews] lastObject] setScrollingEnabled: NO]; що сортувало це для мене. У будь-якому випадку, це не відповідає на моє запитання. Моє питання полягає в тому, що мені це дозволено? Здається, вимкнення прокрутки через SDK заборонено. Але я не впевнений. А як щодо вимкнення прокрутки через javascript.
jsaddour

немає жодних доказів того, що моя пропозиція могла б спричинити відмову яблуком, по суті, викликаючи останній subiew в масиві підпоглядів і встановлюючи 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, а також встановлення висоти веб-перегляду (і додавання до загального розміру вмісту Scrollview) схоже на те, що ви хочете?


Майже. Але видається WebView у заголовку tableView менш складним. Але моє запитання: мені дозволено вимкнути прокрутку webView через SDK? Якщо ні, мені дозволяють робити це через javascript?
jsaddour

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.