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?

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;

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ć :)


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 :)


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;
    }
}

Po pierwsze, próbuję użyć metody „setScrollEnabled” i Apple odrzuciło mój IPA. Potem zmieniłem tę metodę i zaakceptowałem.
mturhan55


10

Wersja SWIFT 3

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

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.


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

to załatwiło to dla mnie


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.



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];



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.


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)


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;
    }
}

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?


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];

1
będzie działać aż do aktualizacji, w której zmieni się miejsce widoku przewijania
Martin
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.