Domanda

Qualcuno sa come fermare un UIWebView da rimbalzare in verticale? Voglio dire, quando un utente tocca lo schermo iphone, trascina il dito verso il basso, e il WebView presenta uno spazio vuoto sopra la pagina web che avevo caricato?

Ho guardato le seguenti soluzioni possibili, ma nessuno di loro ha lavorato per me:

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

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

Come faccio a interrompere un UIScrollView da rimbalzare in orizzontale?

È stato utile?

Soluzione

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

... sembra funzionare bene.

Sarà essere accettato per App Store pure.

Aggiorna : in iOS 5.x + c'è un modo più semplice - ha UIWebView scrollView proprietà, quindi il codice può assomigliare a questo:

webView.scrollView.bounces = NO;

Lo stesso vale per WKWebView.

Altri suggerimenti

stavo guardando un progetto che rende facile per creare applicazioni web a pieno le applicazioni installabili a tutti gli effetti su iPhone chiamato QuickConnect , e ha trovato una soluzione che funziona, se non volete che il vostro schermo sia scorrevole a tutti, che nel mio caso non l'ho fatto.

Nel post sopra progetto / blog citato, accennano una funzione javascript è possibile aggiungere per disattivare il rimbalzo, che si riduce essenzialmente a questo:

    document.ontouchmove = function(event){
        event.preventDefault();
    }

Se volete vedere di più su come implementare, è sufficiente scaricare QuickConnect e check it out .... Ma in fondo tutto ciò che fa è chiamare quel javascript caricamento della pagina ... ho provato solo metterlo nella testa di il mio documento, e sembra funzionare bene.

E tutto quello che ha fatto per raggiungere questo obiettivo è:

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 

}

funziona bene per me ... Inoltre, la risposta spuntato per questa domanda è uno che Apple rifiuterà se lo si utilizza in il vostro iphone app.

In iOS 5 SDK è possibile accedere alla vista di scorrimento associato a una vista web direttamente, piuttosto che scorrendo i suoi subviews.

Quindi, per disabilitare 'rimbalzare' in vista di scorrimento è possibile utilizzare:

myWebView.scrollView.bounces = NO;

Vedere la UIWebView Class Reference .

(Tuttavia, se è necessario supportare le versioni di SDK prima di 5.0, è necessario seguire di Mirek Rusin consiglio .)

Swift 3

webView.scrollView.bounces = false

Attenzione. Ho usato setAllowsRubberBanding: nella mia app, e Apple respinto, affermando che funzioni API non pubbliche non sono ammessi (citare: 3.3.1)

In Swift per disabilitare rimbalzi

webViewObj.scrollView.bounces = false

Il metodo di Brad ha lavorato per me. Se lo si utilizza si potrebbe desiderare di rendere un po 'più sicuro.

id scrollView = [yourWebView.subviews objectAtIndex:0];
if( [scrollView respondsToSelector:@selector(setAllowsRubberBanding:)] )
{
    [scrollView performSelector:@selector(setAllowsRubberBanding:) withObject:NO];
}

Se Apple cambia qualcosa allora il rimbalzo tornerà -. Ma almeno la vostra applicazione non vada in crash

In iOS5 solo se si ha intenzione di lasciare che gli utenti zoom dei contenuti WebView (e.i .: doppio tap) l'impostazione di rimbalzo non è sufficiente. È necessario impostare anche alwaysBounceHorizontal e le proprietà alwaysBounceVertical a NO, altrimenti quando lo zoom-out (un altro doppio tap ...) per impostazione predefinita è rimbalzare di nuovo.

attraversai la raccolta di subviews di UIWebView e impostare il loro background per [UIColor blackcolor], lo stesso colore dello sfondo pagina web. La vista sarà ancora rimbalzare ma non mostrerà che sfondo grigio scuro brutto.

Sembra a me come l'UIWebView ha un UIScrollView. È possibile utilizzare le API documentate per questo, ma che rimbalza è fissato per entrambe le direzioni, non singolarmente. Questo è nella documentazione API. UIScrollView ha una proprietà di rimbalzo, in modo da qualcosa come questo funziona (non so se c'è più di uno 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;
    }
}

Ero seccato per scoprire che UIWebView non è una vista di scorrimento, quindi ho fatto una sottoclasse personalizzata per arrivare alla vista di scorrimento della visualizzazione Web. Questo suclass contiene una vista di scorrimento in modo da poter personalizzare il comportamento della visualizzazione web. Le battute di questa classe sono:

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

}

Poi, quando si crea una visualizzazione web personalizzato, è possibile disattivare rimbalzare con:

customWebView.scrollView.bounces = NO; //(or customWebView.scrollView.alwaysBounceVertically = NO)

Questo è un ottimo modo di uso generale per fare una vista web con il comportamento di scorrimento personalizzabile. Ci sono solo un paio di cose da guardare fuori per:

  • come con qualsiasi vista, avrete anche bisogno di ignorare - (id) initWithCoder: se lo si utilizza in Interface Builder
  • quando si crea inizialmente una vista web, le sue dimensioni il contenuto è sempre lo stesso, come le dimensioni del fotogramma della vista. Dopo si scorre il web, la dimensione dei contenuti rappresenta la dimensione dei contenuti web reali all'interno della vista. Per aggirare il problema, ho fatto qualcosa di hacky - chiamando -setContentOffset:. CGPointMake (0,1) animato: SI per forzare un cambiamento impercettibile che impostare la dimensione contenuto proprio della visualizzazione web

sono imbattuto in questa ricerca di una risposta e alla fine ho appena un colpo su una risposta della mia da cazzeggio. Ho fatto

[[webview scrollView] setBounces:NO];

e ha funzionato.

Questo ha funzionato per me, e ben troppo (sto usando PhoneGap con WebView)

[[webView.webView scrollView] setScrollEnabled:NO];

o

[[webView scrollView] setScrollEnabled:NO];

Ho provato un approccio leggermente diverso per prevenire UIWebView oggetti da scorrimento e rimbalza:. Aggiungendo un riconoscitore gesto per sostituire altri gesti

Sembra, UIWebView o la sua visualizzazione secondaria scroller utilizza il proprio sistema di riconoscimento pan gesto per rilevare lo scorrimento degli utenti. Ma secondo la documentazione di Apple non v'è un modo legittimo di rilevante un riconoscitore gesto con un altro. UIGestureRecognizerDelegate protocollo ha un metodo gestureRecognizer: shouldRecognizeSimultaneouslyWithGestureRecognizer:. - che permette di controllare il comportamento di altri riconoscitori collisione gesto

Quindi, quello che ho fatto è stato

nel metodo viewDidLoad del controller della vista:

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

dunque, il metodo gesto di override:

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

Naturalmente, questo metodo delegato mi può più complesso in un'applicazione reale - ci può disattivare altri sistemi di riconoscimento in modo selettivo, analizzando otherGestureRecognizer.view e il processo decisionale in base a ciò che è vista.

E, infine, per ragioni di completezza, il metodo che abbiamo registrato come un gestore di pan:

- (void)handlePanFrom:(UIPanGestureRecognizer *)recognizer 
{ 
    // do nothing as of yet
}

può essere vuoto se tutto quello che vogliamo è quello di annullare lo scorrimento viste web e rimbalzare, oppure può contenere il nostro codice per implementare il tipo di movimenti pan e animazioni che veramente vogliamo ...

Finora sto solo sperimentando con tutta questa roba, e sembra funzionare più o meno come lo voglio. Non ho provato a presentare eventuali applicazioni per iStore ancora, però. Ma credo che non ho usato niente senza documenti finora ... Se qualcuno lo trova in caso contrario, si prega di informare me.

Ecco due più recenti soluzioni potenziali. A quanto pare, è possibile utilizzare jQTouch o pastrykit per disabilitare lo scorrimento. Tuttavia, non ho questi per lavorare. Si potrebbe essere più competente.

spegnendo lo scorrimento verticale

scavare nella pastrykit

posizionamento fisso sul mobile safari

Questo link mi ha aiutato molto ..... La sua facile .. C'è una demo ..

(Xcode 5 iOS 7 esempio SDK) Ecco un esempio universale App utilizzando la funzione di setBounces ScrollView. Si tratta di un progetto open source / example trova qui: Link SimpleWebView (Progetto Zip e il codice sorgente di esempio)

Una delle subviews di UIWebView dovrebbe essere un UIScrollView. Impostare la sua proprietà per scrollEnabled NO e la vista web avrà scrolling disattivato completamente.

Nota: questo è tecnicamente usando un'API privato e quindi la vostra applicazione potrebbe essere respinta o crash nelle versioni future del sistema operativo. Utilizzare @try e respondsToSelector

Esaminare la bounces proprietà di UIScrollView. Disse la documentazione di Apple:

  

Se il valore della proprietà è YES (il default), la vista rimbalzi di scorrimento quando incontra un limite del contenuto. Bouncing visivamente indica che lo scorrimento ha raggiunto un bordo del contenuto. Se il valore è NO, lo scorrimento si arresta immediatamente al confine contenuti senza rimbalzare.

Assicurarsi che si sta utilizzando il diritto UIWebView. Non sono sicuro di quello che la gerarchia si presenta come un <=>, ma la vista di scorrimento potrebbe essere un genitore, non un bambino, del <=>.

Per disabilitare UIWebView lo scorrimento è possibile utilizzare la seguente riga di codice:

[ObjWebview setUserInteractionEnabled:FALSE];

In questo esempio, ObjWebview è di tipo <=>.

webView.scrollView.scrollEnabled = NO; webView.scrollView.bounces = NO;

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top