2011-10-09 9 views
7

Mam UIWebView wewnątrz UIScrollView.jak przekazać UIWebView przewinąć do UIScrollView? (warunkowo)

Ten pomysł to, aby móc stworzyć więcej przestrzeni czytania na ekranie, gdy użytkownik przewijać stronę w górę - przewijając UIScrollView w górę aż pasek narzędzi jest widoczny, i oczywiście, gdy paski narzędzi jest nomore widoczny faktycznie przewijać strona internetowa, aby wyświetlić więcej treści na stronie.

Przeglądarka Safari IPhone działa dokładnie tak samo.

zobacz zrzut ekranu (pierwszy) dla domyślnego zachowania, które otrzymuję - chyba dlatego, że: przewijanie wiadomości jest zużywane przez widok internetowy, ponieważ dotyk/przewijanie dzieje się bezpośrednio w obszarze podglądu strony.

to, co chciałbym zrobić, to programowo zdecydować, kiedy przesłać "zwój w górę" do UIScrollivew, a kiedy nie.

Wszelkie wskazówki dotyczące obejścia tego problemu będą pomocne. Dzięki!!

enter image description here

enter image description here

Odpowiedz

0

Możesz dodać wyszukiwania a UIWebView w UIScrollView jeden poniżej drugiego. Aby uzyskać przesunięcie zawartości podczas przewijania strony internetowej, możesz skorzystać z poniższego fragmentu kodu.

UIScrollView* currentScrollView; 
for (UIView* subView in testWebView.subviews) { 
    if ([subView isKindOfClass:[UIScrollView class]]) { 
     currentScrollView = (UIScrollView*)subView; 
     currentScrollView.delegate = (id)self; 
    } 
} 

Teraz możesz zmienić wartość bazową offsetu przesunięcia przewijania na wartość przesunięcia, jaką uzyskasz z metody delegowania przeglądania scrollview.

2

UIWebView class reference zniechęca osadzanie UIWebView w UIScrollView:

Ważne: Nie należy osadzić UIWebView lub UITableView obiektów w obiektów UIScrollView. Jeśli to zrobisz, nieoczekiwane zachowanie może spowodować , ponieważ zdarzenia dotykowe dla obu obiektów mogą być pomieszane i niepoprawnie przetwarzane .

Jednak przypuszczam, że nadal chcą realizować swoją funkcję ;-)

Idea 1: Nie osadzić UIWebView w UIScrollView, zamiast uruchomić skrypt przy użyciu metody UIWebView za stringByEvaluatingJavaScriptFromString:, modyfikowania DOM na dodaj pasek narzędzi poniżej. Jeśli jest to wymagane, możesz wywołać kod celu C z dowolnego przycisku wciśniętego na pasku narzędzi, rejestrując niektóre niestandardowe schematy URL.

Idea 2: Nie umieszczaj UIWebView w UIScrollView, ale w zwykłym UIView. Opierając się na sugestii Vignesh, słuchaj wewnętrznego wywołania zwrotnego viewView za pomocą delegata, sprawdzając wzrost contentOffset w porównaniu do wzrostu contentSize za każdym razem, gdy wywoływany jest wywołanie zwrotne. Gdy są równe, oznacza to, że dostałeś się na sam dół. Kiedy to nastąpi, możesz animować ramkę paska narzędzi, aby "wejść" do zawierającego UIView i "wypchnąć" ramkę webView.

Idea 3: Ignoruj ​​zalecenie Apple i osadzaj UIWebView w UIScrollView. Opierając się na sugestii Vignesh, słuchaj wewnętrznego wywołania zwrotnego viewView za pomocą delegata, sprawdzając wzrost contentOffset w porównaniu do wzrostu contentSize za każdym razem, gdy wywoływany jest wywołanie zwrotne. Gdy są równe, oznacza to, że dostałeś się na sam dół. Gdy tak się stanie, ustaw właściwość webView na NO i ustaw ją na YES na scrollView, który zawiera webView i pasek narzędzi. Mam nadzieję, że zwój będzie kontynuowany wystarczająco płynnie. Oczywiście musisz odsłuchiwać zawierający przewijany widok w ten sam sposób, aby określić, kiedy ponownie włączyć userInteractionEnabled.

Wariacją tego pomysłu byłoby po prostu ustawić userInteractionEnabled na NIE dla webView, ale ustawić wysokość ramki webView tak, aby pasowała do jej contentSize, a także odpowiednio powiększyć contentSize zawierającego scrollView.

Oba warianty mają tę wadę, że w niektórych przypadkach nie będziesz w stanie robić takich rzeczy, jak klikanie linków :-(Ale może to wystarczy dla twojej sprawy.Nawet w pierwszej wersji nie jest tak źle.

Powiązane problemy