CALayer il ridimensionamento automatico su iPhone / iPad: come?
-
02-10-2019 - |
Domanda
Sto cercando di creare una sottoclasse UIView ( "GradientView") che si riempirà con un gradiente di vari colori. Ho implementato con l'aggiunta di un CAGradientLayer come un sub-strato di strati di UIView.
Sembrava buono, ma quando è stato ruotato lo schermo, non ridimensionare il livello della sfumatura. Non avendo fortuna trovare una proprietà BOOL sullo strato a ginocchiera, ho calpestato layoutSubviews nel GradientView.
-(void)layoutSubviews {
self.gradientLayer.frame = self.bounds;
}
questo funziona, ma la roba dietro il GradientView è ancora visibile durante l'animazione rotazione del dispositivo. Qual è il modo più semplice per 'AutoResize' che CAGradientLayer per abbinare i limiti del suo livello superiore in modo che l'animazione è liscia (come per UIView il ridimensionamento automatico)?
Soluzione
Si può probabilmente ottenere via con la definizione del procedimento + layerClass su un costume UIView ...
@implementation MyGradientView
+(Class) layerClass {
return [CAGradientLayer class];
}
@end
È possibile inizializzare il livello nella viewDidLoad del controller () (o dovunque), qualcosa di simile ...
-(void)viewDidLoad {
[super viewDidLoad];
[(CAGradientLayer*)[mMyGradientViewInstance layer] setColors:nil];
}
Altri suggerimenti
lo farei:
-
Aumento la dimensione della immagine per il massima di ogni dimensione nel codice willRotateToInterfaceOrientation. . (Per esempio per un 320x480 iPhone - impostare i affievolisce a 480x480)
-
Imposta i limiti in base alla visione neo-ruotata nella funzione didRotateFromInterfaceOrientation.
Questo dovrebbe fare in modo che la vista è abbastanza grande in modo che indipendentemente da come è orientata durante l'animazione, coprirà l'intero schermo. Non sarà "liscio" -. Perché il gradiente dovrà essere ruotato, ma almeno non vedere dietro lo strato in mezzo della rotazione
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
CGRect b;
if(UIInterfaceOrientationIsLandscape(toInterfaceOrientation))b = CGRectMake(0, 0, 480, 320);
else b = CGRectMake(0, 0, 320, 480);
[CATransaction begin];
[CATransaction setValue:[NSNumber numberWithFloat:duration] forKey:kCATransactionAnimationDuration];
[self.view.layer setBounds:b];
[CATransaction commit];
}
Si noti che il ritorno CAGradientLayer come la classe strato funziona solo se si imposta il colore di sfondo della vista a trasparente. Avrai bisogno di impostare il colore di sfondo livello, se avete bisogno di un colore diverso dal trasparente.
nel mio caso questo lavoro:
[[[view.layer sublayers] objectAtIndex:gradientIndex] setFrame:view.bounds];