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

90

Je dois montrer un article Web avec un UITableViewsous l'article.

La seule option que j'ai trouvée était d'afficher l'article dans un UIWebViewdans l'en-tête tableView.

Pour ce faire, je dois obtenir la hauteur du contenu webView et je dois 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 est interdite par Apple mais je n'en ai aucune preuve. Ma candidature sera-t-elle rejetée en utilisant cette solution? Si oui, puis-je utiliser la deuxième solution sans être rejeté?

jsaddour
la source

Réponses:

297

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

webView.scrollView.scrollEnabled = NO; 
webView.scrollView.bounces = NO;
Alex Stanciu
la source
3
merci beaucoup, c'est exactement ce que je cherchais. @jsddour, vous devriez marquer cette réponse comme acceptée!
marcgg
Pour une raison quelconque, cela ne fonctionne pas pour moi. :-( J'ai mis un ScrollView et y ai mis un UIWebView. Ensuite, définissez les 2 lignes ci-dessus dans la méthode viewWillAppear. Mais le défilement fonctionne toujours en mode Web. Quelqu'un peut-il aider ?? Juste pour information, je l'exécute dans Simulateur iOS 7.
Amogh Natu
à quoi ça sert webView.scrollView.bounces = NO;? puisque le code de la première ligne a désactivé le défilement.
Gon
1
J'adore quand les gens prennent une réponse et se présentent sans prendre le temps de donner un vote positif au contributeur. N'existe-t-il aucun moyen de demander à l'utilisateur de choisir une réponse pour voter?
John Cogan
1
pour swift webView.scrollView.scrollEnabled = false / webView.scrollView.bounces = false
Chathuranga Silva
26

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

webView.scrollView.scrollEnabled = NO;

Prends soin de toi :)

Ryan Copley
la source
Ce que je ne comprends pas, c'est pourquoi ce n'est pas dans IB: /, cmon APPLE qu'est-ce que tu fais! Très belle solution tout de même!
Mahmud Ahmad
20

Vous pouvez simplement définir la propriété d'interaction utilisateur de la vue Web sur no ie

webView.userInteractionEnabled = NO;

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

Eshwar Chaitanya
la source
28
Cependant, cela empêche les liens d'être exploités.
Graham Perks
@GrahamPerks J'ai modifié la réponse en ce qui concerne votre commentaire, veuillez l'examiner et l'approuver, merci :)
Eshwar Chaitanya
12

pour toutes les versions 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;
    }
}
mturhan55
la source
tout d'abord, j'essaye la méthode "setScrollEnabled" et Apple a rejeté mon ipa. Puis j'ai changé cette méthode et accepté.
mturhan55
12

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

Gobi M
la source
10

Version SWIFT 3

    webView.scrollView.bounces = false
    webView.scrollView.isScrollEnabled = false
Ahmed Safadi
la source
7

Je pense que le Javascript

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

est de loin la meilleure solution.

En effet :

Votre premier examen, ou le

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

une (même chose) pourrait être rejetée car non documentée, ou faire planter votre application dans une autre mise à jour iOS.

Et le

[[myWebView scrollView] setBounces:NO];

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

Martin
la source
5
[[[WebView subviews] lastObject] setScrollingEnabled:NO];

qui l'a réglé pour moi

theiOSDude
la source
4
Ce serait tellement faux de se fier à cela car ce n'est pas une API exposée.
Deepak Danduprolu
[[[Sous-vues WebView] lastObject] setScrollingEnabled: NO]; cela a réglé le problème pour moi. De toute façon, cela ne répond pas à ma question. Ma question est-ce que je suis autorisé à le faire? Il semble que la désactivation du défilement dans le SDK soit interdite. Mais je ne suis pas sur. Et qu'en est-il de la désactivation du défilement javascript.
jsaddour
il n'y a aucune preuve que ma suggestion provoquerait un rejet par Apple, en fait, en appelant la dernière sous-vue dans le tableau des sous-vues et en définissant scrollingEnabled par rapport à l'API exposée? sûrement?. et oui, allez-y parce que vous pouvez l'utiliser. aucune idée via javascript cependant. Désolé.
theiOSDude
3
Non, vous ne devriez pas faire ça. Comme le dit Deepak, vous ne pouvez pas vous fier à l'ordre interne non documenté des sous-vues dans l'un des éléments de l'interface utilisateur d'Apple. S'ils modifient la structure interne dans une future mise à jour du système d'exploitation, votre application plantera. Ils avertissent spécifiquement de le faire à plusieurs endroits, et de nombreuses applications ont été interrompues lors de la mise à niveau vers iPhone OS 3.0 simplement parce qu'elles l'ont fait.
Brad Larson
5

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

Ventes Jane
la source
5

[[myWebView scrollView] setBounces: NO];

mafonya
la source
4

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 les liens fonctionnent dans votre UIWebView, vous pouvez également faire

[myWebView setUserInteractionEnabled:NO];
Nick Bull
la source
4

Utilise le :

[[webView scrollView] setBounces:NO];
[[webView scrollView] setScrollingEnabled:NO];
Pawel Molodkin
la source
3

Essaye ça,

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

J'ai placé quelques UIWebViews dans un UIScrollViewet il ne défilait pas 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é les UIWebViews dans un UIViewet cela a fonctionné pour moi, mais les liens interactifs ou les divs dans mon HTML à l'intérieur du UIWebViewne fonctionnaient plus.

La seule chose qui a fonctionné pour moi est de garder l' UIWebViewintérieur UIScrollViewafin que les interactions HTML fonctionnent mais UIScrollingpas.

J'ai ensuite créé un délégué personnalisé pour les vues Web à écouter, window.open("http:/customEvent")qui est appelée à partir du 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é de la vue Web reçoit cela, je transmets une notification à un contrôleur qui fait ensuite défiler dynamiquement mon fichier UIScrollView. De toute évidence, j'ai dû construire une logique pour surveiller et faire défiler jusqu'à la page suivante ou précédente. Pas la plus jolie solution mais ça marche pour moi.

marque
la source
3

Essayez ceci dans votre HTML ( <HEAD>balise)

<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)

Gik
la source
2

J'avais besoin de désactiver le défilement car le fait de rejeter un clavier personnalisé gênait vraiment le défilement avec le webView. Rien d'autre n'a fonctionné et j'ai eu recours à quelque chose comme ça:

-(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;
    }
}
akiraspeirs
la source
1

Une UIWebview et une UITableView sur une UIScrollview et la définition de la hauteur de la vue Web (et l'ajout au ContentSize total de la Scrollview) correspondent-elles à ce que vous voulez?

Henrik Erlandsson
la source
Presque. Mais il semble moins compliqué d'afficher la WebView dans l'en-tête tableView. Mais ma question est: je suis autorisé à désactiver le défilement WebView dans le SDK? Sinon, je suis autorisé à faire du javascript?
jsaddour
1
[[[WebView subviews] lastObject] setScrollingEnabled:NO];
imran ahmed
la source
1
cela fonctionnera jusqu'à la mise à jour où l'emplacement de la vue de défilement changerait
Martin