nel mio caso l'ho fatto in questo modo:
impostare un'istanza CAShapeLayer
come proprietà maschera del livello della vostra abitudine vista sottoclasse
@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 questo livello maschera a tutto schermo. Codice della vista:
- (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
il codice dello strato di maschera:
@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
dalla documentazione:
canale alfa del livello determina la quantità del contenuto del livello e lo sfondo mostra attraverso. I pixel completamente o parzialmente opachi consentono a di visualizzare il contenuto sottostante ma i pixel completamente trasparenti bloccano tale contenuto.
Il valore predefinito di questa proprietà è pari a zero. Quando si configura una maschera , ricordare di impostare la dimensione e la posizione del livello maschera su assicurandosi che sia allineata correttamente con il livello mascherato.
così ho disegnato un cerchio con UIBezierPath per ottenere la maschera rotonda. all'inizio ho impostato il fattore di scala della maschera su 0, quindi nulla del livello della vista è visibile. quindi il fattore di scala è impostato su 1 (riempiendo i limiti del livello) animato che dà una bella animazione di un cerchio aumentandone il raggio dal centro.
potresti aver bisogno di un'altra animazione spostando il punto centrale della vista. entrambe le animazioni possono essere racchiuse in un CAAnimationGroup.
Penso che possa aiuto, ma sii un po 'di chiarezza per favore – user2732294
Spero che le mie modifiche lo rendano un po' più chiaro – hacker2007
@ hacker2007 Puoi dirmi qualche altro dettaglio su "myView", "self.shapeLayer" e "self.layer"? –