CoreGraphics mit Retina Display: klobige Zeichnungen

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

  • CoreGraphics mit Retina Display: klobige Zeichnungen

    Moin,

    ich bastle derweil mein erstes Control seit es Retina Displays gibt.
    Und verzweifle.

    Der Code für die Drawing-Routine ist recht simpel:

    Quellcode

    1. - (void)drawInContext:(CGContextRef)ctx
    2. {
    3. CGRect knobFrame = CGRectInset(self.bounds, 2.0, 2.0);
    4. UIBezierPath *knobPath = [UIBezierPath bezierPathWithRoundedRect:knobFrame
    5. cornerRadius:knobFrame.size.height * self.slider.curvaceousness / 2.0];
    6. // 1) fill - with a subtle shadow
    7. CGContextSetShadowWithColor(ctx, CGSizeMake(0, 1), 1.0, [UIColor grayColor].CGColor);
    8. CGContextSetFillColorWithColor(ctx, self.slider.knobColour.CGColor);
    9. CGContextAddPath(ctx, knobPath.CGPath);
    10. CGContextFillPath(ctx);
    11. // 2) outline
    12. CGContextSetStrokeColorWithColor(ctx, [UIColor grayColor].CGColor);
    13. CGContextSetLineWidth(ctx, 0.1);
    14. CGContextAddPath(ctx, knobPath.CGPath);
    15. CGContextStrokePath(ctx);
    16. }
    Alles anzeigen


    Das Ergebnis auf dem Retina Device ist recht hässlich.
    (Siehe Anhang: oben mein hässliches Control, unten das hübsche UIKit Control.)

    Habs mit ausgeschaltetem AntiAliasing versucht – noch hässlicher. (klobiger schwarzer Rahmen)
    Habs mit [self setScale:[[UIScreen mainScreen] scale]]; versucht – keine Änderung.
    Habs mit UIGraphicsBeginImageContextWithOptions(knobFrame.size, NO, 0.0); versucht – doppelt so groß und immer noch hässlich.

    Was mache ich falsch?
    Wie mache ich es richtig?
    Dateien
    «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
  • Ich zeichne in einen Layer via –drawInContext:.

    [self contentsScale] hat zunächst den Wert 1.0
    Wenn ich ihn auf [[UIScreen mainScreen] scale]; setze, hat es den Wert 2.0

    Und es sieht immer noch genau so aus wie auf dem Screenshot.

    Dieser Layer wird zwei mal (mit zwei anderen Layern) in einer UIControl Subklasse eingebunden und dort stumpf via –setNeedsDisplay: eingeblendet.
    Das Control selbst liegt dann im RootView Controller des Storyboards.

    Grundlage für das Ganze war ein (offenbar veraltetes) Tutorial von Ray Wenderlich:
    raywenderlich.com/36288/how-to-make-a-custom-control

    Ich überfliege gerade die Sourcen, ob er das Ganze auch auf Retina angepasst hat.
    «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

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Marco Feltmann ()

  • Marco Feltmann schrieb:

    Wenn ich ihn auf [[UIScreen mainScreen] scale]; setze, hat es den Wert 2.0

    Und es sieht immer noch genau so aus wie auf dem Screenshot.


    Das funktioniert eigentlich schon. Und der contentsScale ist auch die Ursache dafür, das auf Retina-Displays das Zeug noch in der niedrigen Auflösung gerendert wird. Hast Du nach dem Setzen des contentsScale nochmal ein setNeedsDisplay auf dem Layer aufgerufen?

    ciao

    gandhi
  • Ha, mein Held!

    Ich habe das Setzen des contentsScale statt in der Implementierung der Layer im Layersetup des Controls vorm –setNeedsDisplay eingefügt: läuft.
    Danke!
    «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