2013-06-22 10 views
8

Ho un UIViewController dove creo un gradiente di sfondo conCAGradientLayer Porta in

CAGradientLayer *gradient = [CAGradientLayer layer]; 
    ... 
    gradient.frame = frame; 
    self.backGradient = gradient; 
    [self.view.layer insertSublayer:gradient atIndex:0]; 

funziona benissimo, poi devo inviare la visualizzazione secondaria _selectionFrame del mio controller della vista per eseguire:
(ho spesso bisogno di inviare il _selectionFrame a quella posteriore e in avanti, per l'animazione e lo scopo di disegno)

self è il viewController:

[self.view sendSubviewToBack:_selectionFrame]; 

Tuttavia, questo invia lo _selectionFrame dietro lo gradient. Lo voglio appena sopra il gradiente ma sotto ogni altra sottoview. Il problema è che il gradiente non è una vista, quindi non posso usare le funzioni per il gradiente.
Vorrei chiamare [self.view sendSubviewToBack:gradient];

Ma questo non funziona.

risposta

13

Creare una vista che contenga solo il gradiente

+0

Funziona ed è semplice. – AlexWien

3

La soluzione più semplice è di non inserire il gradiente come sottolivello di self.view.layer. Invece, dovrebbe essereself.view.layer. Una sottoclasse UIView ha un metodo di classe layerClass che ti consente di dire quale classe dovrebbe essere il suo livello.

Oppure, potrebbe essere strato di qualche altra visualizzazione secondaria di self.view, sempre facilmente organizzati utilizzando lo stesso metodo di classe layerClass.

In caso contrario, sarà necessario utilizzare i comandi di livello, non i comandi di visualizzazione, per ordinare i sottotitoli di self.view. Questo include le sue sottoview. In altre parole, se v è una sottoview di self.view, quindi v.layer è un sottolivello di self.view.layer e puoi ordinarlo tra i suoi sottolivellanti riordinando l'array di sottolivelli.

+0

self.view.layer = self.backGradient; non funziona self.view.layer è di sola lettura – AlexWien

+0

Non hai letto quello che ho detto. È necessario utilizzare una UIView personalizzata e implementare 'layerClass' in modo che l'UIView sia" nato "con un CAGradientLayer come livello. – matt

+0

Grazie interessante, ma più complesso del necessario (per me) – AlexWien