J'ai eu un problème similaire dans une application où je suis entièrement d'en contrôler le contenu. Cela ne fonctionnera pas si vous chargez arbitraire des pages du web, mais il peut fonctionner si vous savez que votre haut niveau DOM structure et qu'il n'a pas beaucoup de changement.
Ce qui a fonctionné pour moi a été la suivante.
J'ai eu récursive de trouver le premier UIWebView
's sous-vue de type UIWebOverflowScrollView
avec un cadre de (0, 0, 1024, 768)
. Si je ne pouvais pas en trouver un, c'était un signe sûr que le contenu n'a pas été rendue encore.
L'ayant trouvé, je vérifie ce point de vue de l' layer.sublayers.count
. Lorsque le rendu des finitions, je finis toujours avec un ou trois sous-couches. Si le rendu n'est pas fini, cependant, l'affichage du contenu toujours eu tout au plus une sous-couche.
Maintenant, c'est spécifique à mon DOM structure-mais il se peut que vous faire un semblable "test" si vous comparez la sous-couche de l'arbre avant et après le rendu. Pour moi, la règle de base était "le premier de manière récursive trouvés sous-vue de type UIWebOverflowScrollView
ont au moins trois sous-couches", pour vous, il sera probablement différente.
De toute façon, prendre le plus grand soin si vous décidez d'utiliser cette approche, même si vous n'aurez pas rejeté en UIWebView
's de la vue et de la couche de la hiérarchie, ce genre de comportement n'est pas fiable et est très susceptible de changer dans les futures versions d'iOS. Il peut très bien être incompatibles entre iOS 5 et iOS 6.
Enfin, des extraits de code pour MonoTouch qui devrait être simple à traduire pour Objectif C:
bool IsContentScrollView (UIScrollView scrollView)
{
return scrollView.Frame.Equals (new RectangleF (0, 0, 1024, 768));
}
[DllImport ("/usr/lib/libobjc.dylib")]
private static extern IntPtr object_getClassName (IntPtr obj);
public static string GetClassName (this UIView view) {
return Marshal.PtrToStringAuto (object_getClassName (view.Handle));
}
bool IsWebOverflowScrollView (UIScrollView scrollView)
{
return scrollView.GetClassName () == "UIWebOverflowScrollView";
}
IEnumerable<UIScrollView> ScrollViewsInside (UIView view)
{
foreach (var subview in view.Subviews) {
foreach (var scrollView in ScrollViewsInside (subview).ToList())
yield return scrollView;
if (subview is UIScrollView)
yield return (UIScrollView)subview;
}
}
bool CanMakeThumbnail {
get {
var scrollViews = ScrollViewsInside (this).Where (IsWebOverflowScrollView).ToList ();
var contentView = scrollViews.FirstOrDefault (IsContentScrollView);
// I don't know why, but this seems to be a good enough heuristic.
// When the screen is black, either contentView is null or it has just 1 sublayer.
// This may *break* on any iOS updates or DOM changes--be extra careful!
if (contentView == null)
return false;
var contentLayer = contentView.Layer;
if (contentLayer == null || contentLayer.Sublayers == null || contentLayer.Sublayers.Length < 3)
return false;
return true;
}
}