Anti-Aliasing beim Button-Text

  • Anti-Aliasing beim Button-Text

    Hallo,

    ich habe einen eigenen Button erzeugt, der von UIButton abgeleitet wird. Ich zeichne nur den Hintergrund in drawRect: selbst. Dazu verwende ich CG-Routinen, jedoch keine expliziten Aufrufe der beiden bekannten Anti-Aliasing-Routinen.

    Wenn ich meinen View mit dem Button das erste mal zeige, sieht er OK aus - vgl. Bild #1.

    Wenn ich den View dann aber ein zweites Mal aufrufe, ist der Text "blurry", also offenbar anti-aliased. Vgl. Bild #2.

    Wie kann ich denn das abstellen? Ich möchte eigentlich nicht gern ebenfalls den Text selbst zeichnen ... Könnte ich natürlich, aber das hieße, eine vorhandene Systemfunktion mit etwas überschreiben, das eigentlich nichts anderes macht, als die Systemfunktion - nur eben ohne Anti-Aliasing. Abgesehen davon weiß ich nicht, wie ich das System-Schreiben des Textes "abknipsen" könnte ... :S
  • Ich weiß nicht, warum du einen eigenen Button erzeugst.
    Kommst du mit Kategorien nicht auch ans Ziel?

    Wer weiß, was da intern durcheinander geht...
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • In meine Subklasse von UIButton steckt nichts außer der drawRect:-Methode. Da sollte eigentlich ein vergleichbares Ergebnis herauskommen, wie mit einer Kategorie.

    Meine erste Wahl ist immer "automatisch" eine Subklasse, weil es mir bisher nicht gelungen ist, einer Kategorie weitere Properties zuzuweisen, die ich meist benötige. Aber vielleicht habe ich da auch einen Denkfehler.

    ##Edit:
    Und natürlich benötige ich nur an dieser einen Stelle diesen Button und nicht im ganzen Projekt ...

    BTW: Ich habe es mal eben getestet: Auch als Kategorie (stimmen alle anderen Buttons nicht mehr ...) tritt der Blur-Effekt auf. Komisch.
  • Der Button ist bei der Blurry 1px niedriger.
    Ich wette durch das quetschen kommt der Effekt.

    AA sieht anders aus, so wie in Bild 1. ;)
    Schriften sind im iOS normalerweise ja geglättet.



    edit: Wozu bei dem Button eigentlich händisches draw-rect? Sieht ja nicht sonderlich customized aus.
    Und selbst da ist es normal nicht nötig, da man mit dem CustomType alles was man nornmal braucht ändern kann.
    Ganz ohne Subclass oder Kategorie.

    - Hintergrund (Selbstgezeichnet oder Bild)
    - Schriftfarbe
    - Schattenfarbe
    - Schattenrichtung
    - Schriftart
    - usw.
  • fwtag schrieb:

    Meine erste Wahl ist immer "automatisch" eine Subklasse, weil es mir bisher nicht gelungen ist, einer Kategorie weitere Properties zuzuweisen, die ich meist benötige. Aber vielleicht habe ich da auch einen Denkfehler.

    Für mich sah der Knopf auch nicht sonderlich angepasst aus.
    Wenn du (aus welchen Gründen auch immer) zusätzliche Properties brauchst, dann klappt eine Kategorie natürlich nicht.
    Der Sinn hinter Kategorien ist ja gerade, dass man Methoden hinzufügen kann, ohne ableiten zu müssen. Von Properties war da nie die Rede. ;)

    fwtag schrieb:

    Und natürlich benötige ich nur an dieser einen Stelle diesen Button und nicht im ganzen Projekt ...

    Dann packst du die Kategorie halt nur in den ViewController, in dem du diese zusätzliche Funktionalität brauchst.

    Sitzt du da unter Umständen einem ähnlichen Problem auf wie bei deinem SubView, in dem du -drawRect: überschrieben hattest, obwohl du es nicht hättest tun sollen?
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Tobse001 schrieb:

    Der Button ist bei der Blurry 1px niedriger.

    Da ist was dran - Du hast eindeutig bessere Augen, als ich Brillenschlange. *staun*

    Lucas de Vil schrieb:

    Sitzt du da unter Umständen einem ähnlichen Problem auf wie bei deinem SubView, in dem du -drawRect: überschrieben hattest, obwohl du es nicht hättest tun sollen?

    Nee. Tobse hat völlig Recht: Das liegt daran, dass das OS tatsächlich den ganzen View aus dem Cache 1 Pixel kleiner malt. Und ich weiß inzwischen auch, warum: Ich setze die Position des Elements mit setCenter: und verwende dazu u.a. CGRectGetMidY() des Superviews. Letzterer ist der contentView einer Zelle. Der ist beim 1. Aufruf 44px hoch - und beim 2. nur noch 43px. Das heißt, dass mir CGRectGetMidY() beim zweiten Mal eine um .5px "höhere" Position liefert - mit dem beschriebenen Resultat. Gut - da werde ich noch mal ran müssen.

    Grundsätzliche Frage: Rundet Ihr bei setCenter: die Werte, die Ihr übergebt, eigentlich immer?
  • Mach aus dem CGRectGetMidY(yFloat) ein CGRectGetMidY((int)yGloat) und die Nachkommastelle ist weg.
    Bedenke aber, bei einem Objekt mit ungerader Kantenlänge muss das Center ein .5 Wert sein, damit die Kanten im Pixelgrid sitzen.

    Ich verwende wegen solchen Effekten ehrlich gesagt meist den Origin statt dem Center zum rechnen.
    Da hat man auch bei Bildern mit ungerader Pixelhöhe / -breite immer gerade Werte