Texte durch Zoom verpixelt

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Texte durch Zoom verpixelt

    Servus,

    ich verwende einen UIScrollView der einen UIView beinhaltet.
    Der UIView wiederum binhaltet mehrere UITextFields und UILabels.
    Nun soll man in dem UIView fröhlich scrollen, zoomen und editieren können.
    Funktioniert auch soweit gut, doch beim einzoomen verpixelt der Inhalt,
    beim herauszoomen verschwinden Linien die 1px Breite haben.

    Woran das liegt ist mir grob klar.
    Der Inhalt wird skaliert, aber nicht neu gerendert.
    Da setzt dann mein Problem an.
    Wie sage ich das meinem UIView?

    Ich vermute mal, dass ich die Lösung in dieser Funktion etwa so implementieren muss:

    Quellcode

    1. - (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale {
    2. [contentView jetztNeuRendernBitte];
    3. }


    Aber wie genau, konnte ich bisher leider nicht rausfinden. ?(
    dealloc {
    [myLeak retain];
    }
  • Ist nur hinterste Erinnerung, aber ich meine, dass das gar nicht ohne Weiteres lösbar ist. Wenn ich mich recht entsinne, und da mag ich mich wirklich irren, ist es so, dass Textfelder keinen Zoom vertragen, weil der Font in Pixeln gecachet wird und hierbei lediglich die Bounds beachtet werden.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Weder setNeedsDisplay noch setNeedsDisplayInRect haben was gebracht.

    Quellcode

    1. - (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale {
    2. [contentView setNeedsDisplay]; // <- keine sichtbare Veränderung
    3. }


    Quellcode

    1. - (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale {
    2. CGRect myRect;
    3. myRect.size.height = view.frame.size.height/zoomFaktor;
    4. myRect.size.width = view.frame.size.width/zoomFactor;
    5. [contentView setNeedsDisplayInRect:myRect]; // <- keine sichtbare Veränderung
    6. }


    Das würde also bedeuten, dass ich die Zoom-Funktion von Hand implementieren muss indem ich nicht zoome sondern die größe der UITextFields und der zugehörigen Fonts erhöhe und das animiere???

    Oder alternativ Zoomen, abfragen wie weit gezoomt wurde und dann die UITextField-Eigenschaften ändern und den Zoom damit überschreiben??? 8|

    Geht nicht kann ja eigentlich nicht sein. Wenn man im iPhone-Safari Zoomt ist zunächst die Schrift unscharf.
    Ist der Zoomvorgang beendet wird neu berechnet/nachgerendert/scharf gemacht (was auch immer).
    Der Vorgang ist dort jedenfalls sichtbar.

    Ich bringe mir an diesem Projekt ObjC (iPhone SDK) gerade selbst bei und
    baue ein Kreuzworträtsel, da ich denke, dass man dabei mit sehr viel in berührung kommt.
    Die erwähnten UITextFields und UILabels sind meine Frage und Antwortfelder.
    Hat evtl. noch jemand nen Geistesblitz für das Zoom-Problem?
    dealloc {
    [myLeak retain];
    }
  • WebView kommt leider nicht in frage.

    Das Pixelproblem habe ich gelöst:
    Nach dem Zoom-Vorgang multipliziere ich
    die Breite, Höhe und Schriftgröße der UITextFields mit "scale" und
    setze zoomScale anschließend wieder auf 1.0.

    Quellcode

    1. - (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale {
    2. myFontSize = myFontSize * scale;
    3. myTextField.font = [UIFont systemFontOfSize:fontSize];
    4. CGRect newRect;
    5. newRect.size.height = myTextField.frame.size.height * scale;
    6. newRect.size.width = myTextField.frame.size.width * scale;
    7. newRect.origin.x = myTextField.frame.origin.x; //newRect an X-Pos des UITextField
    8. newRect.origin.y = myTextField.frame.origin.y; //newRect an Y-Pos des UITextField
    9. [myTextField setFrame:newRect];
    10. scrollView.zoomScale = 1.0;
    11. }
    Alles anzeigen


    Da der Zoom nun ja nur geschummelt ist,
    springt mir die Bildschirmanzeige nach "scrollView.zoomScale = 1.0;" sonst wo hin.

    Wie komme ich an die X/Y Position der ScrollView-Anzeige,
    damit ich diese nach Ende des zooms so setzen kann,
    dass der Anwender nicht sieht, dass der Zoom auf 1.0 zurück gesetzt wurde?

    Grüße
    dealloc {
    [myLeak retain];
    }
  • 1000 Dank, das war's. :thumbup:

    Quellcode

    1. - (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale {
    2. CGPoint tmpPoint;
    3. tmpPoint = scrollView.contentOffset;
    4. //MACH HIER DEINEN EIGENEN ZOOM
    5. scrollView.contentOffset = tmpPoint;
    6. }
    dealloc {
    [myLeak retain];
    }