in meinem Fall habe ich es auf diese Weise:
setzen eine CAShapeLayer
Instanz als Maske Eigenschaft Ihrer benutzerdefinierten Ansicht Unterklasse der Schicht
@interface MyCustomView()
@property (nonatomic, strong) CircleShapeLayer *circleShapeLayer;
@end
@implementation MyCustomView
- (id) initWithFrame: (CGRect) frame {
self = [super initWithFrame: CGRectZero];
if (self) {
self.layer.mask = self.shapeLayer;
[self.layer.mask setValue: @(0) forKeyPath: @"transform.scale"];
}
return self;
}
zoom diese Maskenschicht LISTEN. Code Ihrer Ansicht:
- (void) zoom {
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath: @"transform.scale"];
animation.fromValue = [self.layer.mask valueForKeyPath: @"transform.scale"];
animation.toValue = @(1);
animation.duration = 2.0;
animation.timingFunction = [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionEaseInEaseOut];
animation.delegate = self;
// Important: change the actual layer property before installing the animation.
[self.layer.mask setValue: animation.toValue forKeyPath: animation.keyPath];
// Now install the explicit animation, overriding the implicit animation.
[self.layer.mask addAnimation: animation forKey: animation.keyPath];
return;
}
- (CAShapeLayer *) circleShapeLayer {
if (!_ circleShapeLayer) {
_circleShapeLayer = [SGMaskLayer layer];
_circleShapeLayer.delegate = _shapeLayer;
_circleShapeLayer.frame = self.bounds;
_circleShapeLayer.needsDisplayOnBoundsChange = YES;
}
return _circleShapeLayer;
}
@end
der Code der Maskenschicht:
@interface CircleShapeLayer : CAShapeLayer
@end
@implementation CircleShapeLayer
- (void) drawLayer: (CALayer *) layer inContext: (CGContextRef) ctx {
UIGraphicsPushContext(ctx);
UIBezierPath *circlePath = [UIBezierPath bezierPathWithOvalInRect: self.bounds];
self.path = circlePath.CGPath;
UIGraphicsPopContext();
}
@end
aus der Dokumentation:
Die Alphakanal bestimmt die Schicht, wie viel des Inhalts der Schicht und Hintergrund zeigt durch. Vollständig oder teilweise undurchsichtige Pixel erlauben den zugrunde liegenden Inhalt durch zu zeigen, aber vollständig transparente Pixel diesen Inhalt zu blockieren.
Der Standardwert dieser Eigenschaft ist null. Bedenken Sie bei der Konfiguration einer -Maske, dass Sie die Größe und Position der Maskenebene auf einstellen, um sicherzustellen, dass sie korrekt mit der Ebene ausgerichtet ist, die sie maskiert.
Also zeichnete ich einen Kreis mit UIBezierPath, um die runde Maske zu erreichen. Zu Beginn setze ich den Skalierungsfaktor der Maske auf 0, so dass nichts von der Ebene der Ansicht sichtbar ist. dann wird der Maßstabsfaktor auf 1 gesetzt (das Füllen der Grenzen der Ebene), was eine schöne Animation eines Kreises ergibt, der seinen Radius von der Mitte erhöht.
Sie könnten eine weitere Animation benötigen, die den Mittelpunkt Ihrer Ansicht verschiebt. Beide Animationen können in eine CAAnimationGroup eingebunden werden.
ich denke, es kann Hilfe, aber bitte etwas Klarheit bitte – user2732294
Ich hoffe, dass meine Änderungen es ein wenig klarer gemacht – hacker2007
@ hacker2007 Können Sie mir bitte einige weitere Details über "myView", "self.shapeLayer" und "self.layer" sagen? –