Czy wyłączyć przewijanie w UIWebView?

90

Muszę pokazać artykuł internetowy z UITableViewpod artykułem.

Jedyną opcją, jaką znalazłem, było wyświetlenie artykułu w UIWebViewnagłówku tableView.

Aby to zrobić, muszę uzyskać wysokość zawartości webView i wyłączyć przewijanie dla webView.

Znalazłem dwa rozwiązania, aby wyłączyć przewijanie:

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

lub w JavaScript:

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

Słyszałem, że pierwsze rozwiązanie jest zabronione przez Apple, ale nie mam na to żadnego dowodu. Czy moja aplikacja zostanie odrzucona przy użyciu tego rozwiązania? Jeśli tak, czy mogę użyć drugiego rozwiązania bez odrzucenia?

jsaddour
źródło

Odpowiedzi:

297

Począwszy od iOS5 mamy bezpośredni dostęp do widoku przewijania UIWebView.
Możesz wyłączyć przewijanie i odbijanie w ten sposób:

webView.scrollView.scrollEnabled = NO; 
webView.scrollView.bounces = NO;
Alex Stanciu
źródło
3
wielkie dzięki, właśnie tego szukałem. @jsddour, oznacz tę odpowiedź jako zaakceptowaną!
marcgg
Z jakiegoś powodu to nie działa dla mnie. :-( Umieściłem ScrollView i umieściłem w nim UIWebView. Następnie ustaw powyższe 2 wiersze w metodzie viewWillAppear. Ale przewijanie nadal działa w widoku sieciowym. Czy ktoś może pomóc? Tylko dla informacji, uruchamiam go w Symulator iOS 7.
Amogh Natu
jaki jest pożytek webView.scrollView.bounces = NO;? ponieważ kod w pierwszej linii wyłączył przewijanie.
Gon
1
Uwielbiam, gdy ludzie przyjmują odpowiedź i biegają bez poświęcania czasu na udzielenie autorowi głosu pozytywnego. Czy nie ma sposobu, aby powiadomić użytkownika, aby wybrał odpowiedź do głosowania?
John Cogan,
1
for swift webView.scrollView.scrollEnabled = false / webView.scrollView.bounces = false
Chathuranga Silva
26

Ponieważ to pytanie jest nadal aktualne, istnieje nowy sposób, aby to zrobić! (iOS 7.0+, być może także iOS 6, niepotwierdzony)

webView.scrollView.scrollEnabled = NO;

Dbać :)

Ryan Copley
źródło
Nie rozumiem, dlaczego tego nie ma w IB: /, cmon APPLE, co robisz! Mimo wszystko bardzo fajne rozwiązanie!
Mahmud Ahmad
20

Możesz po prostu ustawić właściwość interakcji użytkownika widoku sieci Web na brak np

webView.userInteractionEnabled = NO;

To całkiem proste i działa dobrze, dzięki :)

Eshwar Chaitanya
źródło
28
Jednak zapobiega to podsłuchiwaniu linków.
Graham Perks
@GrahamPerks Zredagowałem odpowiedź w odniesieniu do twojego komentarza, uprzejmie
przejrzyj
12

dla wszystkich wersji ios możesz użyć tego kodu zamiast setScrollEnabled:

for (UIView *view in webview.subviews) {
    if ([view isKindOfClass:[UIScrollView class]]) {
       UIScrollView *scrollView = (UIScrollView *)view;
       scrollView.scrollEnabled = NO;
    }
}
mturhan55
źródło
Po pierwsze, próbuję użyć metody „setScrollEnabled” i Apple odrzuciło mój IPA. Potem zmieniłem tę metodę i zaakceptowałem.
mturhan55
12

Użyj tego <body ontouchmove="event.preventDefault()">

Gobi M
źródło
10

Wersja SWIFT 3

    webView.scrollView.bounces = false
    webView.scrollView.isScrollEnabled = false
Ahmed Safadi
źródło
7

Myślę, że JavaScript

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

to zdecydowanie najlepsze rozwiązanie.

W rzeczy samej :

Twój pierwszy przykład lub

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

jedna (ta sama rzecz) może zostać odrzucona, ponieważ nie została udokumentowana lub spowodować awarię aplikacji w kolejnej aktualizacji iOS.

I

[[myWebView scrollView] setBounces:NO];

metoda nie będzie działać z iOS <5.

Jaskółka oknówka
źródło
5
[[[WebView subviews] lastObject] setScrollingEnabled:NO];

to załatwiło to dla mnie

theiOSDude
źródło
4
Byłoby tak źle polegać na tym, ponieważ nie jest to ujawniony interfejs API.
Deepak Danduprolu
[[[WebView subviews] lastObject] setScrollingEnabled: NO]; to załatwiło to dla mnie W każdym razie to nie odpowiada na moje pytanie. Moje pytanie brzmi, czy mogę to zrobić? Wygląda na to, że wyłączenie przewijania przez SDK jest zabronione. Ale nie jestem pewien. A co z wyłączeniem przewijania javascript.
jsaddour
nie ma żadnych dowodów na to, że moja sugestia spowodowałaby odrzucenie przez Apple, w rzeczywistości, wywołując ostatni widok podrzędny w tablicy subviews i ustawiając scrollingEnabled przeciwko niemu jest ujawniony API? pewno?. i tak, idź na to, bo możesz tego użyć. brak pomysłu przez javascript. Przepraszam.
theiOSDude
3
Nie, nie powinieneś tego robić. Jak mówi Deepak, nie można polegać na nieudokumentowanej wewnętrznej kolejności podglądów podrzędnych w jednym z elementów interfejsu użytkownika Apple. Jeśli zmienią wewnętrzną strukturę w przyszłej aktualizacji systemu operacyjnego, aplikacja ulegnie awarii. W szczególności ostrzegają przed robieniem tego w wielu miejscach, a wiele aplikacji zepsuło się podczas aktualizacji do iPhone OS 3.0 tylko dlatego, że to zrobili.
Brad Larson
5

Pierwsza została odrzucona przez Apple. Przydarzyło mi się to właśnie dziś rano.

Jane Sales
źródło
5

[[myWebView scrollView] setBounces: NO];

mafonya
źródło
4

Nie sądzę, aby pierwsza opcja była zabroniona przez Apple.

Możesz spróbować

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

Jeśli nie chcesz, aby jakiekolwiek linki działały w Twoim UIWebView, możesz również to zrobić

[myWebView setUserInteractionEnabled:NO];
Nick Bull
źródło
4

Użyj tego :

[[webView scrollView] setBounces:NO];
[[webView scrollView] setScrollingEnabled:NO];
Paweł Mołodkin
źródło
3

Spróbuj tego,

[(UIScrollView *)[[webView subviews] lastObject] setScrollEnabled:NO];    
Shanmugaraja G
źródło
3

Umieściłem kilka znaków UIWebViewwewnątrz a UIScrollViewi nie było to dla mnie przewijanie, chyba że wyłączę interakcję użytkownika z podglądami (nawet z [[webview scrollview] setScrollEnabled:NO]). Więc umieściłem UIWebViews wewnątrz a UIViewi to działało dla mnie, ale potem interaktywne linki lub elementy div w moim HTML wewnątrz UIWebViewjuż nie działały.

Jedyną rzeczą, która działała dla mnie, jest zachowanie UIWebViewwewnętrznej strony, UIScrollViewwięc interakcje HTML działają, ale UIScrollingnie.

Następnie utworzyłem niestandardowego delegata do nasłuchiwania widoków internetowych, window.open("http:/customEvent")który jest wywoływany z kodu HTML zawartego w widoku sieciowym. Dodałem również wykrywanie przesunięcia JavaScript, które uruchomi moje zdarzenie niestandardowe.

Kiedy delegat Webview otrzyma to, przekazuję powiadomienie do kontrolera, który następnie dynamicznie przewija mój plik UIScrollView. Oczywiście musiałem zbudować logikę do monitorowania i przewijania do następnej lub poprzedniej strony. Nie jest to najładniejsze rozwiązanie, ale działa na mnie.

znak
źródło
3

Spróbuj tego w swoim HTML ( <HEAD>tag)

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

Wyłączy przewijanie na twojej stronie internetowej.

(działa na każdej stronie internetowej, nie tylko w UIWebView)

Gik
źródło
2

Musiałem wyłączyć przewijanie, ponieważ odrzucenie niestandardowej klawiatury naprawdę zepsuło przewijanie z webView. Nic innego nie działało i uciekłem się do czegoś takiego:

-(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;
    }
}
akiraspeirs
źródło
1

Czy UIWebview i UITableView w UIScrollview i ustawianie wysokości widoku internetowego (i dodawanie do całkowitego ContentSize widoku Scrollview) jest zgodne z tym, co chcesz?

Henrik Erlandsson
źródło
Prawie. Ale wydaje się mniej skomplikowane, aby wyświetlić WebView w nagłówku tableView. Ale moje pytanie brzmi: czy mogę wyłączyć przewijanie webView przez SDK? Jeśli nie, mogę to zrobić przez javascript?
jsaddour
1
[[[WebView subviews] lastObject] setScrollingEnabled:NO];
imran ahmed
źródło
1
będzie działać aż do aktualizacji, w której zmieni się miejsce widoku przewijania
Martin