web-dev-qa-db-fra.com

Désactiver le défilement sur un UIWebView autorisé?

Je dois montrer un article Web avec un UITableView sous l'article.

La seule option que j'ai trouvée était d'afficher l'article dans un UIWebView dans l'en-tête de la table.

Pour ce faire, je dois obtenir la hauteur du contenu de WebView et désactiver le défilement pour la WebView.

J'ai trouvé deux solutions pour désactiver le défilement:

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

ou en JavaScript:

<script type="text/javascript">
touchMove = function(event) {
    event.preventDefault();
}

J'ai entendu dire que la première solution était interdite par Apple mais je n'en ai aucune preuve. Ma demande sera-t-elle rejetée par cette solution? Si oui, puis-je utiliser la deuxième solution sans être rejeté?

89
jsaddour

À partir de iOS5, nous avons un accès direct à la vue de défilement de UIWebView.
Vous pouvez désactiver le défilement et les rebonds comme ceci:

webView.scrollView.scrollEnabled = NO; 
webView.scrollView.bounces = NO;
294
Alex Stanciu

Puisque cette question est toujours applicable, il existe une nouvelle façon de le faire! (iOS 7.0+, peut-être iOS 6 également, non confirmé)

webView.scrollView.scrollEnabled = NO;

Prends soin :)

25
Ryan Copley

Vous pouvez simplement définir la propriété d'interaction utilisateur de la vue Web sur non i.e.

webView.userInteractionEnabled = NO;

C'est assez simple et fonctionne bien, merci :)

20
Eshwar Chaitanya

pour toutes les versions d'ios, vous pouvez utiliser ce code au lieu de setScrollEnabled:

for (UIView *view in webview.subviews) {
    if ([view isKindOfClass:[UIScrollView class]]) {
       UIScrollView *scrollView = (UIScrollView *)view;
       scrollView.scrollEnabled = NO;
    }
}
12
mturhan55

Utilisez celui-ci <body ontouchmove="event.preventDefault()">

11
Gobi M

Swift 3 version

    webView.scrollView.bounces = false
    webView.scrollView.isScrollEnabled = false
9
Ahmed Safadi

Je pense que le Javascript

<script type="text/javascript">
touchMove = function(event) {
event.preventDefault();
}

est de loin la meilleure solution.

Effectivement :

Votre premier examen, ou le

[[[WebView subviews] lastObject] setScrollingEnabled:NO];

une (même chose) pourrait être rejetée parce que non documentée, ou vous faire planter l'application dans une autre mise à jour iOS.

Et le

[[myWebView scrollView] setBounces:NO];

cette méthode ne fonctionnera pas avec iOS <5.

7
Martin
[[[WebView subviews] lastObject] setScrollingEnabled:NO];

qui l'a réglé pour moi

5
theiOSDude

[[WebView scrollView] set Bounces: NO];

5
mafonya

Le premier est rejeté par Apple. C'est ce qui m'est arrivé ce matin.

5
Jane Sales

Utilise le :

[[webView scrollView] setBounces:NO];
[[webView scrollView] setScrollingEnabled:NO];
4
Pawel Molodkin

Je ne pense pas que la première option soit interdite par Apple.

Tu pourrais essayer

[[[Webview subviews] lastObject] setScrollingEnabled:NO];

Si vous ne souhaitez pas que des liens fonctionnent dans votre UIWebView, vous pouvez également le faire.

[myWebView setUserInteractionEnabled:NO];
4
Nick Bull

Essaye ça,

[(UIScrollView *)[[webView subviews] lastObject] setScrollEnabled:NO];    
3
Shanmugaraja G

Essayez ceci dans votre code HTML (<HEAD> tag)

<script> 
  document.ontouchmove = function(event) { event.preventDefault(); }
</script>

Cela désactivera le défilement sur votre page Web.

(fonctionne sur n'importe quelle page Web, pas seulement UIWebView)

3
Gik

J'ai placé des UIWebViews dans un UIScrollView et le défilement ne s'est pas déroulé pour moi, à moins que je ne désactive l'interaction de l'utilisateur sur les vues Web (même avec le [[webview scrollview] setScrollEnabled:NO]). J'ai donc placé le UIWebViews dans un UIView et cela a fonctionné pour moi, mais les liens interactifs ou les divs dans mon code HTML dans le UIWebView ne fonctionnaient plus.

La seule chose qui a fonctionné pour moi est de garder le UIWebView à l'intérieur du UIScrollView afin que les interactions HTML fonctionnent, mais pas le UIScrolling.

J'ai ensuite créé un délégué personnalisé pour les vues Web afin d'écouter window.open("http:/customEvent") appelée à partir du code HTML contenu dans la vue Web. J'ai également ajouté une détection de balayage JavaScript qui déclenchera mon événement personnalisé.

Lorsque le délégué webview reçoit cela, je passe une notification à un contrôleur qui fait ensuite défiler dynamiquement mon UIScrollView. Évidemment, je devais construire une logique pour surveiller et passer à la page suivante ou précédente. Pas la plus jolie solution mais ça marche pour moi.

3
Mark

J'avais besoin de désactiver le défilement, car ignorer un clavier personnalisé était vraiment perturbé par le défilement avec WebView. Rien d'autre n'a fonctionné et j'ai eu recours à quelque chose comme ceci:

-(void)viewDidLoad{
  [super viewDidLoad];
  [self.webView.scrollView addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:nil];
  self.webView.scrollView.showsVerticalScrollIndicator = NO;
}  

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
    if (!CGPointEqualToPoint(self.webView.scrollView.contentOffset, CGPointZero)){
        self.contentOffset = CGPointZero;
    }
}
2
akiraspeirs

Une vue UIWebview et une vue UITableView sur une vue UIScrollview, ainsi que le réglage de la hauteur de la vue Web (et l’ajout à la taille totale ContentSize de la vue Défilement) vous conviennent-ils?

1
Henrik Erlandsson
[[[WebView subviews] lastObject] setScrollingEnabled:NO];
1
imran ahmed