"Overlay" o.ä. soll durchsicht auf Bild dahinter bieten

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

  • "Overlay" o.ä. soll durchsicht auf Bild dahinter bieten

    Hi!

    Im Prinzip möchte ich die Funktion der "öffnenden Kameralinse" des alten iOS nachempfinden. Etwas genauer:

    Ich habe ein Bild. Dieses soll _irgendwie_ überdeckt werden. Ein schwarzes Feld in der größe des Bildes z.b.. Dabei soll nur ein kleiner Kreis durchsicht auf dieses Bild bieten. UND: dieser durchsichtige Kreis soll sich vergrößern können.

    Habe schon ein paar Ansätze probiert- komme aber nicht wirklich weiter.

    Danke für Eure Tipps!!
    Daniel
  • macmoonshine schrieb:

    Die Maske kannst Du dann wie hier beschrieben animieren.


    Funktioniert mit der Maske einwandfrei. Habe ein Bild meinem imageView hinzugefügt. Da drauf dann den layer mit der maske. geht.

    Problem: wenn ich mit CATransaction (code aus deinem link) animieren will, geschehen zwar die Änderungen, aber nicht animiert.
    --> Außerdem würde ich gern die Möglichkeit haben, die Animation per Klick anzuhalten.

    Nochmals danke!;)
  • Ich habe dazu auch eine Frage.

    Ist es möglich mit einem CALayer einen Bereich eines View transparent machen wo sich ein Subview befindet? Also einen Ausschnitt in einem View in der größe eines anderen Views?
  • Das macht allerdings nicht viel Sinn. Das geht auch ohne eine Maske indem ich ein sichtbares View über einem transparentem lege.
    Interessanter wäre es einen Bereich in einem sichtbaren View als transparent zu deklarieren.
  • bachelor schrieb:

    Interessanter wäre es einen Bereich in einem sichtbaren View als transparent zu deklarieren.

    Ja, und genau das machst Du, indem Du eine Maske erzeugst, die an den transparenten Stellen des Views ebenfalls transparent ist. Wenn Deine Maske beispielsweise in der Mitte ein Loch hat hat der View in der Mitte auch ein Loch.
    „Meine Komplikation hatte eine Komplikation.“
  • Mir ist leider immer noch nicht klar, wie ich das machen kann.

    Mit diesem code wird alles ausserhalb des maskView transparent:

    Quellcode

    1. CAShapeLayer *mask = [CAShapeLayer layer];
    2. CGPathRef path = CGPathCreateWithRect(self.maskView.frame, NULL);
    3. mask.path = path;
    4. CGPathRelease(path);
    5. self.mainView.layer.mask = mask;


    Wie kann ich es invertieren?
  • macmoonshine vielen Dank für deine Hilfe! Es hat jetzt so funktioniert:

    Quellcode

    1. CAShapeLayer *mask = [CAShapeLayer layer];
    2. CGMutablePathRef path = CGPathCreateMutable();
    3. CGPathAddRect(path, NULL, self.mainView.frame);
    4. CGPathAddRect(path, NULL, self.maskView.frame);
    5. mask.path = path;
    6. CGPathRelease(path);
    7. mask.fillRule = kCAFillRuleEvenOdd;
    8. self.mainView.layer.mask = mask;

  • Ich habe mich meiner ursprünglichen Frage des Threads nochmal angenommen. Ausgehend von diesem Beitrag:

    macmoonshine schrieb:

    Du kannst Dir auch eine eigene Layerklasse schreiben, die ein schwarzes Rechteck mit einem runden Loch anzeigt und einen solchen Layer über das Bild legen. Wenn Du die Lochgröße über eine dynamische Property beschreibst, kannst Du sie auch animierbar machen. Animationen kannst Du pausieren lassen.


    Nochmal kurz was ich möchte:
    Ein ImageView soll ein Bild zeigen. Darüber soll ein Layer liegen, der ein Loch hat, das durchsicht auf das Bild bietet. Dieses Loch möchte ich animiert vergrößern und verschieben.

    Was ich bis jetzt habe:
    - habe mich grundsätzlich an das Beispiel aus dem o.g. Buch gehalten.
    - ImageView mit eigener Klasse:

    Quellcode

    1. + (Class)layerClass {
    2. return [ShutterLayer class];
    3. }
    4. - (void)setupLayer {
    5. self.image = [UIImage imageNamed:@"background.jpg"];
    6. //wie wird das ImageView dargestellt?
    7. CALayer *theLayer = self.layer;
    8. theLayer.cornerRadius = 10.0;
    9. theLayer.borderColor = [UIColor blueColor].CGColor;
    10. theLayer.borderWidth = 2.0;
    11. }
    12. - (id)initWithFrame:(CGRect)inFrame {
    13. self = [super initWithFrame:inFrame];
    14. if (self) {
    15. [self setupLayer];
    16. }
    17. return self;
    18. }
    19. - (void)awakeFromNib {
    20. [super awakeFromNib];
    21. [self setupLayer];
    22. NSLog(@"awakefromnib in picture_imageview.m");
    23. }
    Alles anzeigen

    - eine Layerklasse mit dynamischen property´s: x, y, width, heigth und einer Methode "drawInContext:(CGContextRef)inContext:"

    Quellcode

    1. - (void)drawInContext:(CGContextRef)inContext {
    2. //Bereitstellung des Layer-Inhalts
    3. NSLog(@"drawincontext");
    4. //Code aus Beispiel übernommen (ich bräuchte keine Berechnung mit Radius)
    5. CGRect theBounds = self.bounds;
    6. CGSize theSize = theBounds.size;
    7. CGFloat thePart = 1;
    8. CGPoint theCenter = CGPointMake(CGRectGetMidX(theBounds), CGRectGetMidY(theBounds));
    9. CGFloat theRadius = fminf(theSize.width, theSize.height) / 2.0 - 5.0;
    10. CGFloat theAngle = 2 * (thePart - 0.25) * M_PI;
    11. CGContextSaveGState(inContext);
    12. CGContextSetFillColorWithColor(inContext, [UIColor redColor].CGColor);
    13. CGContextMoveToPoint(inContext, theCenter.x, theCenter.y);
    14. CGContextAddArc(inContext, theCenter.x, theCenter.y, theRadius, -M_PI / 2.0, theAngle, NO);
    15. CGContextAddLineToPoint(inContext, theCenter.x, theCenter.y);
    16. CGContextFillPath(inContext);
    17. CGContextRestoreGState(inContext);
    18. }
    Alles anzeigen


    Meine Probleme:
    1) der Layer hat noch keine Maske. Wo muss ich dem Layer die Maske zuweisen, damit sie animiert wird?
    2) das Bild verschwindet sobald ich den Layer setze

    Wie immer dürft ich mich auf grundsätzlich falsche Vorgehensweisen hinweisen! ;)

    Danke!!!
    Daniel