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:

Http://www.iphonedevsdk.com/forum/iphone-sdk-development/996-turn-off-scrolling-bounces-uiwebview.html

Http://forums.macrumors.com/showthread.php?t=619534

Jak zatrzymać uiscrollview przed odbijaniem się poziomo?

Author: Community, 2009-02-01

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;
 405
Author: Mirek Rusin,
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.

 45
Author: Brad Parks,
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.
 18
Author: Zigglzworth,
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 .)

 17
Author: jstr,
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)

 9
Author: Raf,
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
 7
Author: Ego Slayer,
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
 4
Author: Jugal K Balara,
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ę.

 3
Author: Gavin Maclean,
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.

 3
Author: il Malvagio Dottor Prosciutto,
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.

 2
Author: pedro,
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;
    }
}
 2
Author: spymaster,
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.
 2
Author: Rolf Hendriks,
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.
 2
Author: Luke,
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];
 2
Author: Jason G,
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ć.
 1
Author: PP-RD,
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.

Wyłączanie przewijania pionowego

Kopanie w pastrykit

 1
Author: cannyboy,
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..

 1
Author: S.P.,
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)

 1
Author: Matthew Ferguson,
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

 0
Author: rpetrich,
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ą jest NO, 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.

 0
Author: Alex,
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.

 0
Author: Sandip Patel - SM,
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;

 0
Author: Kumaresan P,
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