iphone - example - wkwebview property




Arrêtez UIWebView de "rebondir" verticalement? (15)

Est-ce que quelqu'un sait comment empêcher un UIWebView de rebondir verticalement? Je veux dire quand un utilisateur touche l'écran de son iPhone, fait glisser son doigt vers le bas, et le webview montre un endroit vide au-dessus de la page Web que j'avais chargé?

J'ai regardé les solutions possibles suivantes, mais aucune d'elles n'a fonctionné pour moi:

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

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

Comment empêcher un UIScrollView de rebondir horizontalement?



Arrivé à travers cette recherche d'une réponse et j'ai finalement eu de la chance sur une réponse de moi-même en jouant. J'ai fait

[[webview scrollView] setBounces:NO];

et ça a marché.


Cela a fonctionné pour moi, et magnifiquement aussi (j'utilise phonegap avec webView)

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

ou

[[webView scrollView] setScrollEnabled:NO];

Dans Swift pour désactiver les rebonds

webViewObj.scrollView.bounces = false

Eh bien tout ce que j'ai fait pour accomplir ceci est:

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 

}

Fonctionne bien pour moi ... Aussi, la réponse cochée pour cette question est celle que Apple rejettera si vous l'utilisez dans votre application iPhone.


Il me semble que l'UIWebView a un UIScrollView. Vous pouvez utiliser des API documentées pour cela, mais le rebond est défini pour les deux directions, pas individuellement. C'est dans les documents de l'API. UIScrollView a une propriété de rebond, donc quelque chose comme ça fonctionne (ne sait pas s'il y a plus d'un 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;
    }
}

J'ai essayé une approche légèrement différente pour empêcher les objets UIWebView de défiler et de faire rebondir: ajouter un outil de reconnaissance de gestes pour remplacer les autres gestes.

Il semble que UIWebView ou sa sous-vue scroller utilise son propre outil de reconnaissance de mouvements pour détecter le défilement de l'utilisateur. Mais selon la documentation d'Apple, il existe un moyen légitime de remplacer un identificateur de geste par un autre. Le protocole UIGestureRecognizerDelegate a une méthode gestureRecognizer: shouldRecognizeSimultaneousWithGestureRecognizer: - qui permet de contrôler le comportement de tout système de reconnaissance de mouvement en collision.

Donc, ce que j'ai fait était

dans la méthode viewDidLoad du contrôleur de vue:

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

puis, la méthode de remplacement de geste:

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

Bien sûr, cette méthode de délégué peut me rendre plus complexe dans une application réelle - nous pouvons désactiver d'autres sélecteurs sélectivement, en analysant otherGestureRecognizer.view et en prenant une décision en fonction de ce que c'est.

Et enfin, pour être complet, la méthode que nous avons enregistrée en tant que gestionnaire de panoramique:

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

il peut être vide si tout ce que nous voulons est d'annuler le défilement et le rebond des vues Web, ou il peut contenir notre propre code pour implémenter le genre de mouvements de pan et d'animations que nous voulons vraiment ...

Jusqu'à présent, je suis en train d'expérimenter tout ça, et ça semble fonctionner plus ou moins comme je le veux. Cependant, je n'ai pas encore essayé de soumettre des applications à iStore. Mais je crois que je n'ai pas utilisé quelque chose sans-papiers jusqu'à présent ... Si quelqu'un trouve le contraire, s'il vous plaît informez-moi.


J'ai parcouru la collection des sous-vues d'UIWebView et défini leurs arrière-plans sur [UIColor blackColor], la même couleur que l'arrière-plan de la page Web. La vue rebondira toujours mais il ne montrera pas ce fond gris foncé laid.


L'une des sous-vues de UIWebView devrait être une UIScrollView . Définissez sa propriété scrollEnabled sur NO et le défilement de la vue Web sera entièrement désactivé.

Note: techniquement, cela utilise une API privée et donc votre application pourrait être rejetée ou planter dans les prochaines versions du système d'exploitation. Utiliser @try et @try


La méthode de Brad a fonctionné pour moi. Si vous l'utilisez, vous voudrez peut-être le rendre un peu plus sûr.

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

Si Apple change quelque chose, le rebond reviendra - mais au moins votre application ne tombera pas en panne.


Regardez dans la propriété UIScrollView de UIScrollView . Quoth les docs d'Apple:

Si la valeur de la propriété est YES (valeur par défaut), la vue déroulante rebondit lorsqu'elle rencontre une limite du contenu. Le fait de rebondir visuellement indique que le défilement a atteint un bord du contenu. Si la valeur est NO , le défilement s'arrête immédiatement à la limite du contenu sans rebondir.

Assurez-vous que vous utilisez le bon UIScrollView . Je ne suis pas sûr de ce que la hiérarchie ressemble à un UIWebView , mais la vue de défilement pourrait être un parent, pas un enfant, de l' UIWebView .


Sur iOS5 uniquement si vous prévoyez de permettre aux utilisateurs de zoomer sur le contenu de la vue Web (ei: double-touche), le paramètre de report n'est pas suffisant. Vous devez également définir les propriétés alwaysBounceHorizontal et alwaysBounceVertical sur NO, sinon, lorsqu'elles effectuent un zoom arrière (un autre double appui ...), elles rebondiront par défaut.



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


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

... semble fonctionner correctement.

Il sera également accepté sur App Store.

Mise à jour : dans iOS 5.x + il y a un moyen plus simple - UIWebView a la propriété scrollView , donc votre code peut ressembler à ceci:

webView.scrollView.bounces = NO;




uiwebview