Nella mia app ho un UIView
che sta utilizzando CALayer
al fine di ottenere un'ombra:animazione liscia quando si anima shadowPath di un CALayer
@implementation MyUIView
- (instancetype) initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if(!self) return self;
self.layer.shadowColor = [UIColor colorWithWhite:0 alpha:.2].CGColor;
self.layer.shadowOffset = CGSizeMake(0, 2);
self.layer.shadowOpacity = 1;
self.layer.shadowRadius = 1;
return self;
}
@end
Se voglio qualcosa che si avvicini prestazioni ragionevoli, devo definire il CALayer
' s shadowPath
:
@implementation MyUIView
- (void) setFrame:(CGRect)frame {
[super setFrame:frame];
self.layer.shadowPath = CGPathCreateWithRect(self.bounds, NULL);
}
@end
ho notato due cose ogni volta che animare questo UIView
:
Se Non utilizzare un
shadowPath
, l'ombra anima la avanti bene con rotazioni e cambiamenti di formato telaio. L'avvertimento qui è un'animazione molto lenta e una generale mancanza di prestazioni.Se fare uso un
shadowPath
quando ilUIView
è animato l'animazione è liscia e tempestivo, comunque transizione dell'ombra stesso è molto più simili a blocchi (e meno liscia) che è senzashadowPath
.
Esempi:
- Con
shadowPath
: https://gfycat.com/ColdBlissfulIndusriverdolphin (? Notare come l'ombra si comporta come un rettangolo poco trasformata) - Senza
shadowPath
(la lentezza della animazione è più evidente sul dispositivo, ma si ottiene l'idea): https://gfycat.com/ActiveRemorsefulBandicoot
Edit:
Vale la pena notare che queste animazioni sono impliciti - non sto invocando io stesso. Sono il risultato della rotazione dello UIViewController
con l'orientamento del dispositivo. L'ombra è su un UIView
che modifica le dimensioni durante la rotazione.
Parte del problema è che, mentre i percorsi sono animatable, non hanno _implicit_ animazioni (quelli che sono innescati da un cambiamento di proprietà). Quindi, durante la rotazione il frame si anima, ma il percorso cambia immediatamente al suo valore finale. –
@ DavidRönnqvist Ah. Ciò ha senso. C'è un modo per farlo manualmente? – mattsven
Sì, è possibile aggiungere manualmente un'animazione. Ma a meno che tu non abbia gli stessi tempi e durate dell'animazione del frame, non avrà un aspetto corretto. –