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)?

È stato utile?

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:

  1. 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)

  2. 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];
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top