Question

Quelqu'un sait comment arrêter un UIWebView de rebondir verticalement? Je veux dire lorsqu'un utilisateur touche l'écran de leur iPhone, traîne vers le bas du doigt, et la WebView montre un endroit vide au-dessus de la page Web que j'avais chargé?

J'ai regardé les solutions possibles suivantes, mais aucun d'entre eux travaillaient 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 puis-je arrêter un UIScrollView de rebondir horizontalement?

Était-ce utile?

La solution

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

... semble fonctionner correctement.

Elle sera acceptée à l'App Store ainsi.

Mise à jour : 5.x iOS + il y a un moyen plus facile - a UIWebView propriété scrollView, de sorte que votre code peut ressembler à ceci:

webView.scrollView.bounces = NO;

Idem pour WKWebView.

Autres conseils

Je regardais un projet qui le rend facile de créer des applications web comme des applications installables à part entière sur l'iPhone appelé QuickConnect , et a trouvé une solution qui fonctionne, si vous ne voulez pas que votre écran soit déroulable du tout, ce qui dans mon cas, je ne l'ai pas.

Dans le post projet / blog mentionné ci-dessus, ils mentionnent une fonction javascript vous pouvez ajouter à désactiver le rebondissement, qui se résume essentiellement à ceci:

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

Si vous voulez en savoir plus sur la façon dont ils mettent en œuvre, il suffit de télécharger QuickConnect et check it out .... Mais fondamentalement tout ce qu'il fait est appeler javascript sur chargement de la page ... Je l'ai essayé simplement de mettre dans la tête mon document, et il semble fonctionner très bien.

Et bien tout ce que je l'ai fait pour ce faire est la suivante:

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 ... En outre, la réponse à cette question fait tic tac est un que Apple va rejeter si vous l'utilisez en votre application iphone.

Dans le SDK iOS 5, vous pouvez accéder à la vue de défilement associée à une vue Web directement plutôt que itérer ses sous-vues.

pour désactiver « rebondir » dans la vue de défilement, vous pouvez utiliser:

myWebView.scrollView.bounces = NO;

Voir Référence de la classe UIWebView .

(Toutefois, si vous devez prendre en charge les versions du SDK 5.0 avant, vous devez suivre conseils de Mirek Rusin.)

Swift 3

webView.scrollView.bounces = false

Avertissement. Je setAllowsRubberBanding: dans mon application, et Apple a rejeté, en indiquant que les fonctions API non publiques ne sont pas autorisés (citer: 3.3.1)

Swift pour désactiver les rebonds

webViewObj.scrollView.bounces = false

La méthode de Brad a travaillé pour moi. Si vous l'utilisez, vous voudrez peut-être faire un peu plus en sécurité.

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 plantera pas

iOS5 que si vous prévoyez de laisser les utilisateurs zoom le contenu WebView (e.i .: robinet à double) le réglage de rebond ne suffit pas. Vous devez également définir alwaysBounceHorizontal et propriétés alwaysBounceVertical NO, sinon quand ils zoom arrière (un autre double tap ...) à défaut, il va rebondir à nouveau.

Je traversai la collection des sous-vues de UIWebView et mis leurs fonds à [UIColor BlackColor], la même couleur que l'arrière-plan de la page Web. La vue sera toujours rebondir mais il ne montrera pas que laid fond gris foncé.

Il me semble que le UIWebView a une UIScrollView. Vous pouvez utiliser les API documentées pour cela, mais rebondissement est réglé pour les deux sens, et non individuellement. Ceci est dans l'API docs. UIScrollView a une propriété de rebond, donc quelque chose comme cela fonctionne (ne sais 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;
    }
}

Je suis agacé de constater que UIWebView n'est pas une vue de défilement, donc je fait une sous-classe personnalisée pour obtenir à la vue de défilement de la vue Web. Cette suclass contient une vue de défilement de sorte que vous pouvez personnaliser le comportement de votre affichage Web. Les punchlines de cette classe sont:

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

}

Ensuite, lorsque vous créez une vue Web personnalisée, vous pouvez désactiver rebondir avec:

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

Ceci est un excellent moyen d'usage général pour faire une vue web avec le comportement de défilement personnalisable. Il y a juste quelques petites choses à surveiller:

  • comme avec tout point de vue, vous aurez également besoin de passer outre - (id) initWithCoder: si vous l'utilisez dans Interface Builder
  • lorsque vous créez d'abord une vue Web, sa taille de contenu est toujours la même que la taille du cadre de la vue. Une fois que vous faites défiler le Web, la taille du contenu représente la taille du contenu Web réelle à l'intérieur de la vue. Pour contourner ce problème, je l'ai fait quelque chose hacky - appeler -setContentOffset:. CGPointMake (0,1) animé: OUI pour forcer un changement imperceptibles qui définira la taille du contenu propre de l'affichage Web

suis tombé sur cette recherche une réponse et je finalement juste eu de la chance sur une réponse de ma propre par bricoler. Je l'ai

[[webview scrollView] setBounces:NO];

et cela a fonctionné.

Cela a fonctionné pour moi, et très bien aussi (je me sers PhoneGap avec webView)

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

ou

[[webView scrollView] setScrollEnabled:NO];

J'ai essayé une approche légèrement différente pour éviter UIWebView objets de défilement et rebondir:. L'ajout d'un geste de reconnaissance pour remplacer d'autres gestes

Il semble, UIWebView ou son sous-vue de changeurs utilise son propre geste pan de reconnaissance pour détecter le défilement de l'utilisateur. Mais selon la documentation d'Apple, il est un moyen légitime de passer outre un geste de reconnaissance avec un autre. UIGestureRecognizerDelegate protocole a une méthode gestureRecognizer: shouldRecognizeSimultaneouslyWithGestureRecognizer:. - ce qui permet de contrôler le comportement de tous les dispositifs de reconnaissance de gestes de collision

Alors, ce que je faisais é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]; 

Ensuite, la méthode de correction de mouvement:

// 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 plus complexe dans une application réelle - nous pouvons désactiver d'autres sélective de reconnaissance, l'analyse otherGestureRecognizer.view et la prise de décision en fonction de ce qu'il est vue.

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

- (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 rebondir de vue sur le Web, ou il peut contenir notre propre code pour mettre en oeuvre le genre de mouvements pan et des animations que nous voulons vraiment ...

Jusqu'à présent, je suis juste expérimenter avec tout ce genre de choses, et il semble fonctionner plus ou moins comme je le veux. Je ne l'ai pas essayé de présenter des applications à iStore encore, cependant. Mais je crois que je n'ai rien utilisé non documenté à ce jour ... Si quelqu'un trouve autrement, s'il vous plaît me informer.

Voici deux solutions possibles plus récentes. Apparemment, vous pouvez utiliser jQTouch ou pastrykit pour désactiver le défilement. Cependant, je n'ai pas ces travailler. Vous pourriez être plus compétent.

éteindre défilement vertical

creuser dans pastrykit

positionnement fixe sur Safari Mobile

Ce lien m'a aidé beaucoup ..... Il est facile .. Il y a une démo ..

(Xcode 5 iOS 7 exemple SDK) est ici un exemple App universelle en utilisant la fonction de setBounces ScrollView. Il est un projet / exemple open source situé ici: Lien vers SimpleWebView (Zip projet et code source exemple)

L'un des sous-vues doit être un UIWebView UIScrollView. Définissez sa propriété à scrollEnabled et la vue NO Web aura désactivé le défilement entièrement.

Remarque: cette technique utilise une API privée et donc votre application pourrait être rejetée ou plantage dans les versions ultérieures du système d'exploitation. Utilisez et @try respondsToSelector

Regardez dans la propriété de bounces UIScrollView. Quoth la documentation d'Apple:

  

Si la valeur de la propriété est YES (par défaut), les rebonds de vue de défilement quand il rencontre une limite du contenu. Rebondissant indique visuellement que le défilement a atteint un bord du contenu. Si la valeur est NO, le défilement arrête immédiatement à la limite de contenu sans rebondir.

Assurez-vous que vous utilisez le droit UIWebView. Je ne suis pas sûr de ce que la hiérarchie ressemble à un <=>, mais la vue de défilement pourrait être un parent, pas un enfant, du <=>.

Pour désactiver le défilement, vous pouvez UIWebView utiliser la ligne de code suivante:

[ObjWebview setUserInteractionEnabled:FALSE];

Dans cet exemple, est de type ObjWebview <=>.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top