L'histoire de la WebView et de ses NSScrollers...

AntilogAntilog Membre
16:57 modifié dans API AppKit #1
Bonjour,

Pour afficher mes données, j'ai une simple WebView toute bête, sans rien de particulier, même pas sous-classée.
J'ai également un NSPopUpButton pour sélectionner le facteur de zoom d'affichage de ma NSView.

Voici le code correspondant à  l'application du zoom:
- (IBAction)popUpSizeChanged:(id)sender;<br />{<br />	float scale;<br />	NSView *documentView;<br />	NSClipView *clipView;<br />	NSScrollView * scrollView;<br />	<br />	scale=[self popUpselectedSize]; // .75=75%, 1=100%, 1.5=150%, 2 = 200%<br />	documentView = [[[myWebView mainFrame] frameView] documentView];<br />	clipView = (NSClipView *)[documentView superview];<br />	scrollView = (NSScrollView *)[clipView superview];<br /><br />	// diviser la frame size (rectangle affiché par le pourcentage)<br />	[clipView setBoundsSize:NSMakeSize([clipView frame].size.width / scale, [clipView frame].size.height / scale)];<br />	[scrollView setNeedsDisplay:YES];<br />}<br />


D'après ce que j'ai compris jusqu'à  présent:
Une WebView contient au moins une WebFrame :mainFrame, qui contient à  son tour une WebFrameView, contenant une NSView: documentView.
La superView de cette documentView est la clipView, et la superView de cette clipView est la ScrollView.

Tout celà  fonctionne très bien, je peux changer le pourcentage et l'affichage suit, les scrollers changent même de taille pour correspondre à  la quantité d'information affichée par rapport à  la taille totale à  afficher, les NSScrollers disparaissent quand en réduction j'affiche toute la page, sauf...
Si j'agrandis ma fenêtre au point de faire disparaà®tre le NSScroller horizontal, pour un zoom à  100% (ce serait probablement la même chose en vertical), il ne réapparaà®t pas quand je passe à  200%.

J'ai tenté
[scrollView setAutohidesScrollers:NO];<br />

Résultat intéressant: affiche le scroller "vide" quand le contenu ne doit pas pouvoir défiler, mais n'affiche toujours rien quand il faudrait un scroller.

J'essaye aussi:
[scrollView setHasHorizontalScroller:YES];

, rien n'y fait.
Aussitôt après le setHasHorizontalScroller, un [scrollView hasHorizontalScroller] me retourne NO.

Je ne sais plus trop que faire, avez-vous une idée?
Où donc ai-je loupé quelque chose?  :(

Réponses

  • 16:57 modifié #2
    Ce que je ferais à  ta place est de ne pas permettre l'utilisation de scrollers dans la web view ([tt][[[webView mainFrame] frameView] setAllowsScrolling:NO];[/tt]), mais de mettre la webview dans une scrollView 'normale', plutôt que de bidouiller à  l'intérieur de la WebView, qui n'est pas prévue pour ça.
  • AntilogAntilog Membre
    16:57 modifié #3
    Merci de ta réponse, Renaud!

    J'étais en train d'écrire un beau message, avec forces d'explications, un peu d'humour et même des graphiques ASCII quand le serveur d'OC est tombé dans les choux (à  cause de moi???  :o ), donc je donne une version condensée:

    Je ne suis pas d'accord avec toi, je n'utilise que des méthodes propres et documentées de la NSView, cela devrait fonctionner (d'ailleurs cela fonctionne parfaitement bien à  99%, seuls les scrollers dans le cas prècis d'une fenêtre plus large que la page à  100% me posent problème).

    Toutefois, j'ai essayé ta technique, et ça m'a amené des comportements anormaux même à  100%; à  mon humble avis, c'est une solution un peu "capillotractée".

    Je pense soumettre le problème à  la liste Webkitsdk-dev, si personne n'a d'autre idée...

    Je rappelle le problème (simple):
    permettre de zoomer sur une WebView, avec un bon positionnement des scrollers

    Merci,
  • AntilogAntilog Membre
    16:57 modifié #4
    Bien!

    Finalement, selon Apple, il semble bien qu'il ne soit pas possible de zoomer une WebView. La personne m'ayant répondu sur Webkitsdk fut même étonné que j'ai réussi à  zoomer quelque chose!
    Tout cela me semble d'autant plus dommage que je reste persuadé qu'il manque peu de chose pour que ça marche, il semble juste y avoir une légère incohérence au niveau du calcul du frame (ou du bound, je ne sais plus) pour la clipView.

    Donc je suis passé à  mon plan II (position de repli), et j'ai modifié le CSS de mon programme interactivement, pour obtenir zoom-in/zoom-out.
    Ca fonctionne parfaitement en agrandissement, mais en réduction, l'effet n'est pas terrible. La WebView essaye toujours de rendre les textes le plus lisiblement possible, ce qui est compréhensible pour son usage 'normal', pour ma part, je souhaite plus conserver précisément la mise en page que la lisibilité du texte.

    Il ne me reste plus qu'à  travailler sur le plan III (double-repli?), c'est à  dire de créer une NSImage de la WebView, et de n'afficher que cette image.

    Encore un peu de travail en perspective  :(renaud):
Connectez-vous ou Inscrivez-vous pour répondre.