Zatrzymać UIWebView od" odbijania " pionowo?
Czy ktoś wie jak powstrzymać UIWebView przed odbijaniem się w pionie? Mam na myśli, gdy użytkownik dotknie ekranu iphone ' a, przeciągnie palec w dół, a Widok sieci pokazuje puste miejsce nad załadowaną stroną internetową?
Przyjrzałem się następującym możliwym rozwiązaniom, ale żadne z nich nie zadziałało ja:
22 answers
for (id subview in webView.subviews)
if ([[subview class] isSubclassOfClass: [UIScrollView class]])
((UIScrollView *)subview).bounces = NO;
...wygląda na to, że działa dobrze.
Zostanie również przyjęta do App Store.
Aktualizacja : W iOS 5.x + jest łatwiejszy sposób- UIWebView
ma właściwość scrollView
, więc Twój kod może wyglądać tak:
webView.scrollView.bounces = NO;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-19 15:57:53
Patrzyłem na projekt, który ułatwia tworzenie aplikacji internetowych jako pełnoprawnych aplikacji instalowalnych na iPhonie o nazwie QuickConnect , i znalazłem rozwiązanie, które działa, jeśli nie chcesz, aby ekran był przewijany w ogóle, co w moim przypadku nie.
W powyższym projekcie / poście na blogu wspominają o funkcji javascript, którą możesz dodać, aby wyłączyć odbijanie, co zasadniczo sprowadza się do tego:
document.ontouchmove = function(event){
event.preventDefault();
}
Jeśli chcesz zobaczyć więcej o tym, jak oni zaimplementuj go, po prostu pobierz QuickConnect i sprawdź.... Ale w zasadzie wszystko, co robi, to wywoływanie javascript na ładowaniu strony... Próbowałem tylko umieścić go w głowicy mojego dokumentu, i wydaje się, że działa dobrze.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-12 11:39:51
Cóż, wszystko, co zrobiłem, aby to osiągnąć, to:
UIView *firstView = [webView.subviews firstObject];
if ([firstView isKindOfClass:[UIScrollView class]]) {
UIScrollView *scroll = (UIScrollView*)firstView;
[scroll setScrollEnabled:NO]; //to stop scrolling completely
[scroll setBounces:NO]; //to stop bouncing
}
Mi pasuje...
Ponadto zaznaczona odpowiedź na to pytanie jest taka, którą Apple odrzuci, jeśli użyjesz jej w
Twoja aplikacja na iphone ' a.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-25 07:15:20
W iOS 5 SDK można uzyskać dostęp do widoku przewijania powiązanego z widokiem sieci Web bezpośrednio, a nie iterację poprzez jego podviewów.
Aby wyłączyć "odbijanie" w widoku przewijania, możesz użyć:
myWebView.scrollView.bounces = NO;
Zobacz odniesienie do klasy UIWebView .
(Jeśli jednak potrzebujesz wsparcia wersji SDK przed 5.0, powinieneś zastosować się do rady Mirka Rusina .)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:50
Ostrzeżenie. Używałem setAllowsRubberBanding: w mojej aplikacji, a Apple odrzuciło go, stwierdzając, że Niepubliczne funkcje API są niedozwolone (cite: 3.3.1)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-16 17:29:31
Swift 3
webView.scrollView.bounces = false
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-16 06:58:36
W języku Swift, aby wyłączyć odbicia
webViewObj.scrollView.bounces = false
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-01 10:13:13
Metoda Brada zadziałała na mnie. Jeśli go użyjesz, możesz sprawić, że będzie trochę bezpieczniejszy.
id scrollView = [yourWebView.subviews objectAtIndex:0]; if( [scrollView respondsToSelector:@selector(setAllowsRubberBanding:)] ) { [scrollView performSelector:@selector(setAllowsRubberBanding:) withObject:NO]; }
Jeśli apple coś zmieni, odbicie wróci - ale przynajmniej Twoja aplikacja nie zawiesi się.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-18 15:21:32
Na iOS5 tylko jeśli planujesz pozwolić użytkownikom powiększyć zawartość widoku sieci Web (np.: podwójne stuknięcie) ustawienie odbijania nie wystarczy. Musisz również ustawić alwaysBounceHorizontal i alwaysBounceVertical właściwości NA NO, w przeciwnym razie, gdy pomniejszą (kolejny podwójny kranu...) domyślnie odbije się ponownie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-12 08:05:09
Przejechałem kolekcję podwizów UIWebView i ustawiłem ich tła na [uicolor blackColor], taki sam kolor jak tło strony internetowej. Widok nadal się odbije, ale nie pokaże tego brzydkiego ciemnoszarego tła.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-02 09:51:13
Wygląda na to, że UIWebView ma UIScrollView. Można w tym celu użyć udokumentowanych interfejsów API, ale odbijanie jest ustawiane dla obu kierunków, a nie indywidualnie. Jest to w dokumentach API. UIScrollView ma właściwość bounce, więc coś takiego działa (Nie wiem, czy jest więcej niż jeden scrollview):
NSArray *subviews = myWebView.subviews;
NSObject *obj = nil;
int i = 0;
for (; i < subviews.count ; i++)
{
obj = [subviews objectAtIndex:i];
if([[obj class] isSubclassOfClass:[UIScrollView class]] == YES)
{
((UIScrollView*)obj).bounces = NO;
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-03 08:05:36
Byłem zirytowany, gdy dowiedziałem się, że UIWebView nie jest widokiem przewijania, więc zrobiłem niestandardową podklasę, aby dostać się do widoku przewijania. Ten suclass zawiera widok przewijania, dzięki czemu można dostosować zachowanie widoku sieci web. Do tej klasy należą:
@class CustomWebView : UIWebview
...
- (id) initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame];
// WebViews are subclass of NSObject and not UIScrollView and therefore don't allow customization.
// However, a UIWebView is a UIScrollViewDelegate, so it must CONTAIN a ScrollView somewhere.
// To use a web view like a scroll view, let's traverse the view hierarchy to find the scroll view inside the web view.
for (UIView* v in self.subviews){
if ([v isKindOfClass:[UIScrollView class]]){
_scrollView = (UIScrollView*)v;
break;
}
}
return self;
}
Następnie, podczas tworzenia niestandardowego widoku sieci Web, można wyłączyć odbijanie za pomocą:
customWebView.scrollView.bounces = NO; //(or customWebView.scrollView.alwaysBounceVertically = NO)
Jest to świetny sposób na tworzenie widoku sieci Web z konfigurowalnym zachowaniem przewijania. Jest tylko kilka things to watch out for:
- tak jak w każdym widoku, musisz również nadpisać - (id) initWithCoder: jeśli używasz go w Interface Builder
- podczas tworzenia widoku sieci Web rozmiar jego zawartości jest zawsze taki sam jak rozmiar ramki widoku. Po przewinięciu strony internetowej Rozmiar zawartości odpowiada rozmiarowi rzeczywistej zawartości sieci Web w widoku. Aby to obejść, zrobiłem coś hacky-calling-setContentOffset: CGPointMake (0,1) animated:tak, aby wymusić niezauważalne zmiana, która ustawi właściwy rozmiar zawartości widoku sieci web.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-08 20:55:54
Natknąłem się na to szukanie odpowiedzi i w końcu po prostu miałem szczęście na własną odpowiedź, bałaganiąc się. Zrobiłem
[[webview scrollView] setBounces:NO];
I zadziałało.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-20 13:57:30
To działa dla mnie, i pięknie też (używam phonegap z webView)
[[webView.webView scrollView] setScrollEnabled:NO];
Lub
[[webView scrollView] setScrollEnabled:NO];
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-21 19:02:14
Próbowałem nieco innego podejścia, aby zapobiec UIWebView obiekty z przewijania i odbijania: dodanie rozpoznawania gestów, aby zastąpić inne gesty.
Wydaje się, UIWebView lub jego subview scroller używa własnego rozpoznawania gestów pan do wykrywania przewijania użytkownika. Ale zgodnie z dokumentacją Apple istnieje uzasadniony sposób nadpisania jednego rozpoznawania gestów innym. UIGestureRecognizerDelegate protokół ma metodę gestureRecognizer: shouldrecognizesimultaneously z gesturerecognizer: - który pozwala kontrolować zachowanie dowolnych zderzających się rozpoznawaczy gestów.
Więc to co zrobiłem było
W metodzie kontrolera widoku viewDidLoad:
// Install a pan gesture recognizer // We ignore all the touches except the first and try to prevent other pan gestures
// by registering this object as the recognizer's delegate
UIPanGestureRecognizer *recognizer;
recognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanFrom:)];
recognizer.delegate = self;
recognizer.maximumNumberOfTouches = 1;
[self.view addGestureRecognizer:recognizer];
self.panGestureFixer = recognizer;
[recognizer release];
Następnie metoda obejścia gestów:
// Control gestures precedence
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
// Prevent all panning gestures (which do nothing but scroll webViews, something we want to disable in
// the most painless way)
if ([otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]])
{
// Just disable every other pan gesture recognizer right away
otherGestureRecognizer.enabled = FALSE;
}
return NO;
}
Oczywiście ta metoda delegowania może być bardziej skomplikowana w prawdziwej aplikacji - możemy selektywnie wyłączyć inne rozpoznawacze, analizując inne rozpoznawacze.widok i tworzenie decyzja w oparciu o to, jaki to pogląd.
I wreszcie, dla kompletności, metoda, którą zarejestrowaliśmy jako obsługę pan:
- (void)handlePanFrom:(UIPanGestureRecognizer *)recognizer
{
// do nothing as of yet
}
Może być pusty, jeśli chcemy tylko anulować przewijanie i odbijanie widoków internetowych, lub może zawierać nasz własny kod, aby zaimplementować takie ruchy pan i animacje, jakie naprawdę chcemy...
Jak na razie eksperymentuję z tymi wszystkimi rzeczami i wygląda na to, że działają mniej więcej tak, jak chcę. Nie próbowałem jeszcze wysyłać żadnych aplikacji do iStore, chociaż. Ale wierzę, że do tej pory nie użyłem niczego nieudokumentowanego... Jeśli ktoś znajdzie coś innego, proszę mnie o tym poinformować.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-10 09:00:46
Oto dwa nowe potencjalne rozwiązania. Najwyraźniej możesz użyć jqtouch lub pastrykit, aby wyłączyć przewijanie. Jednak nie mam ich do działania. Możesz być bardziej kompetentny.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-18 10:06:07
Stałe pozycjonowanie na mobilnym safari
Ten link Bardzo mi pomógł.....To proste.. Jest demo..
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-18 10:21:19
(Xcode 5 iOS 7 SDK przykład) oto Uniwersalny przykład aplikacji za pomocą funkcji scrollview setBounces. Jest to projekt / przykład open source znajdujący się tutaj: Link do SimpleWebView (przykład Zip projektu i kodu źródłowego)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-21 04:20:28
Jeden z podwidywań UIWebView
powinien być UIScrollView
. Ustaw jego właściwość scrollEnabled
na NO
, a przewijanie w widoku sieci będzie całkowicie wyłączone.
Uwaga: jest to technicznie przy użyciu prywatnego API, a więc Twoja aplikacja może zostać odrzucona lub zawieszona w przyszłych wydaniach systemu operacyjnego. Użyj @try
i respondsToSelector
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-02 13:16:11
Sprawdź bounces
Właściwość UIScrollView
. Quoth the Apple docs:
Jeśli wartością właściwości jest
YES
(domyślna), widok przewijania odbija się, gdy napotka granicę zawartości. Odbijanie wizualnie wskazuje, że przewijanie osiągnęło krawędź zawartości. Jeśli wartością jestNO
, przewijanie zatrzymuje się natychmiast na granicy zawartości bez odbijania się.
Upewnij się, że używasz właściwego UIScrollView
. Nie jestem pewien jak wygląda hierarchia dla UIWebView
, ale widok przewijania może być rodzicem, a nie dzieckiem UIWebView
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-06 16:47:16
Aby wyłączyć UIWebView
przewijanie można użyć następującego wiersza kodu:
[ObjWebview setUserInteractionEnabled:FALSE];
W tym przykładzie, {[2] } jest typu UIWebView
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-05 22:20:29
WebView.scrollView.scrollEnabled = NO; webView.scrollView.bounces=NO;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-10 10:00:43