UIView Maskierung zweier Layer führt zu unscharfer View

  • UIView Maskierung zweier Layer führt zu unscharfer View

    Hallo,

    ich habe mit Hilfe zweier Layer in einer UIView eine Maskierung realisiert.

    backgroundLayer erhält eine Textur
    maskLayer erhält eine primitive geometrische Form

    Wenn ich nun die Maske auf den BackgroundLayer lege erhalte ich zwar die gewünschte geometrische Form in ihrer Textur aber die Ränder sind unscharf - unabhängig davon ob ich nun eine Textur wähle oder eine Farbe für den BackgroundLayer.

    Nachfolgend poste ich mal den Code:

    PHP-Quellcode

    1. - (id)initWithFrame:(CGRect)frame {
    2. if ((self = [super initWithFrame:frame])) {
    3. UIImage *image = TEXTUR;
    4. // Initialize layers
    5. backgroundLayer = [[CALayer layer] retain];
    6. backgroundLayer.frame =
    7. CGRectMake(-(image.size.width - self.bounds.size.width) / 2.f,
    8. -(image.size.width - self.bounds.size.width) / 2.f,
    9. image.size.width,
    10. image.size.width);
    11. maskLayer = [[CALayer layer] retain];
    12. maskLayer.frame =
    13. CGRectMake((image.size.width - self.bounds.size.width) / 2.f,
    14. (image.size.width - self.bounds.size.width) / 2.f,
    15. self.bounds.size.width,
    16. self.bounds.size.height);
    17. // Create mask bitmap
    18. maskBitmapImage = [self createMaskBitmapImage];
    19. [self setMaskLayerContents];
    20. CGImageRef markerImage = image.CGImage;
    21. backgroundLayer.contents = (id)markerImage;
    22. [backgroundLayer setMask:maskLayer]; // Maskierung
    23. [self.layer addSublayer:backgroundLayer];
    24. }
    25. return self;
    26. }
    27. - (CGContextRef) createMaskBitmapImage {
    28. CGRect theBounds = self.bounds;
    29. CGFloat theRadius = CGRectGetWidth(theBounds) / 2.0;
    30. theBounds.size.width = 28;
    31. theBounds.size.height = 28;
    32. theBounds.origin.x = theRadius - (theBounds.size.width / 2.0);
    33. theBounds.origin.y = 24.;
    34. UIGraphicsBeginImageContext(self.bounds.size);
    35. CGContextRef theContext = UIGraphicsGetCurrentContext();
    36. CGContextSetFillColorWithColor(theContext, [UIColor colorWithWhite:1.0f alpha:1.0f].CGColor);
    37. CGContextSetLineWidth(theContext, 3.0);
    38. CGContextStrokeEllipseInRect(theContext, theBounds); // Scheibe
    39. CGContextSetShouldAntialias(theContext, YES);
    40. CGContextRetain(theContext);
    41. UIGraphicsEndImageContext();
    42. return theContext;
    43. }
    44. - (void) setMaskLayerContents {
    45. CGImageRef maskImage = CGBitmapContextCreateImage(maskBitmapImage);
    46. maskLayer.contents = (id)maskImage;
    47. [maskLayer needsDisplay];
    48. CGImageRelease(maskImage);
    49. }
    Alles anzeigen


    Das Ergebnis ist wirklich nicht zufridenstellen - man hat das gefühlt einen Schleier vor den Augen zu haben wenn man es sich anschaut.


    Wie kann ich das besser umsetzen?
    Oder was könnte die Ursache der Kantenunschärfe sein?


    Vielen Danke für eure Hilfe ;)
  • Thallius schrieb:

    Meistens kommt das wenn man bei seiner Koordinaten Berechnung auf halbe Koordinaten (oder eben nicht Ganzzahlige) kommt.

    Gruß

    Claus

    Naja, es sieht auf dem Retina Display unscharf aus.

    Zudem handelt es sich um einen Ring, den ich texturiert habe. Die Linienstärke beträgt 3 Pixel.

    Ich habe ganzzahlige Koordinaten.

    Bei jeder Maskierung habe ich diesen Effekt. Das sieht eher aus wie ein weicher Übergang der Rante - obwohl das ja eher scharfkantig sein sollte.
  • Okay,

    es ist wohl so das setMask: zwar eine dynamische Maskierung erlaubt aber ein etwas unsauberes Ergebnis liefert.

    Ich werde diese Technik etwas modifizieren bzw. zu setMask: eine eigene extension schreiben.


    Vielen Dank für eure Unterstützung ;)

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