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é?
À 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;
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 :)
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 :)
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;
}
}
Utilisez celui-ci <body ontouchmove="event.preventDefault()">
Swift 3 version
webView.scrollView.bounces = false
webView.scrollView.isScrollEnabled = false
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.
[[[WebView subviews] lastObject] setScrollingEnabled:NO];
qui l'a réglé pour moi
[[WebView scrollView] set Bounces: NO];
Le premier est rejeté par Apple. C'est ce qui m'est arrivé ce matin.
Utilise le :
[[webView scrollView] setBounces:NO];
[[webView scrollView] setScrollingEnabled:NO];
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];
Essaye ça,
[(UIScrollView *)[[webView subviews] lastObject] setScrollEnabled:NO];
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)
J'ai placé des UIWebView
s 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 UIWebView
s 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.
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;
}
}
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?
[[[WebView subviews] lastObject] setScrollingEnabled:NO];