Domanda

  

Possibile duplicato:
   Disegnare manualmente una sfumatura nelle app per iPhone?

La mia applicazione deve visualizzare il testo in UIView o UILabel ma lo sfondo deve essere un gradiente rispetto a un vero UIColor . L'uso di un programma di grafica per creare l'aspetto desiderato non va bene poiché il testo può variare in base ai dati restituiti da un server.

Qualcuno conosce il modo più rapido per affrontare questo? I tuoi pensieri sono molto apprezzati.

È stato utile?

Soluzione

Puoi anche usare un'immagine grafica larga un pixel come gradiente e impostare la proprietà view per espandere l'immagine per riempire la vista (supponendo che stai pensando a un gradiente lineare semplice e non a un qualche tipo di elemento grafico radiale).

Altri suggerimenti

Mi rendo conto che questo è un thread più vecchio, ma per riferimento futuro:

A partire da iPhone SDK 3.0, i gradienti personalizzati possono essere implementati molto facilmente, senza sottoclassi o immagini, usando il nuovo CAGradientLayer :

 UIView *view = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 100)] autorelease];
 CAGradientLayer *gradient = [CAGradientLayer layer];
 gradient.frame = view.bounds;
 gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor blackColor] CGColor], (id)[[UIColor whiteColor] CGColor], nil];
 [view.layer insertSublayer:gradient atIndex:0];

Dai un'occhiata ai documenti CAGradientLayer. Puoi facoltativamente specificare i punti iniziale e finale (nel caso in cui non desideri un gradiente lineare che va direttamente dall'alto verso il basso) o anche posizioni specifiche che si associano a ciascuno dei colori.

Puoi usare Core Graphics per disegnare il gradiente, come indicato nella risposta di Mike. Come esempio più dettagliato, puoi creare una sottoclasse UIView da utilizzare come sfondo per il tuo UILabel . In quella sottoclasse UIView , sovrascrivi il metodo drawRect: e inserisci il codice simile al seguente:

- (void)drawRect:(CGRect)rect 
{
    CGContextRef currentContext = UIGraphicsGetCurrentContext();

    CGGradientRef glossGradient;
    CGColorSpaceRef rgbColorspace;
    size_t num_locations = 2;
    CGFloat locations[2] = { 0.0, 1.0 };
    CGFloat components[8] = { 1.0, 1.0, 1.0, 0.35,  // Start color
         1.0, 1.0, 1.0, 0.06 }; // End color

    rgbColorspace = CGColorSpaceCreateDeviceRGB();
    glossGradient = CGGradientCreateWithColorComponents(rgbColorspace, components, locations, num_locations);

    CGRect currentBounds = self.bounds;
    CGPoint topCenter = CGPointMake(CGRectGetMidX(currentBounds), 0.0f);
    CGPoint midCenter = CGPointMake(CGRectGetMidX(currentBounds), CGRectGetMidY(currentBounds));
    CGContextDrawLinearGradient(currentContext, glossGradient, topCenter, midCenter, 0);

    CGGradientRelease(glossGradient);
    CGColorSpaceRelease(rgbColorspace); 
}

Questo esempio particolare crea una sfumatura bianca, in stile lucido, che viene disegnata dalla parte superiore di UIView al suo centro verticale. Puoi impostare UIView backgroundColor su quello che ti piace e questo gloss verrà disegnato sopra quel colore. Puoi anche disegnare un gradiente radiale usando la funzione CGContextDrawRadialGradient .

Devi solo dimensionare questo UIView in modo appropriato e aggiungere il tuo UILabel come sottoview per ottenere l'effetto che desideri.

EDIT (23/04/2009): su suggerimento di St3fan, ho sostituito il frame della vista con i suoi limiti nel codice. Questo si corregge nel caso in cui l'origine della vista non sia (0,0).

Quando si utilizza CAGradientLayer , al contrario di CGGradient , il gradiente non è uniforme, ma presenta un evidente passaggio. Vedi questo esempio:

Per ottenere risultati più interessanti è meglio usare CGGradient .

La risposta di Mirko Froehlich ha funzionato per me, tranne quando volevo usare colori personalizzati. Il trucco è specificare il colore dell'interfaccia utente con Tonalità, saturazione e luminosità anziché RGB.

CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = myView.bounds;
UIColor *startColour = [UIColor colorWithHue:.580555 saturation:0.31 brightness:0.90 alpha:1.0];
UIColor *endColour = [UIColor colorWithHue:.58333 saturation:0.50 brightness:0.62 alpha:1.0];
gradient.colors = [NSArray arrayWithObjects:(id)[startColour CGColor], (id)[endColour CGColor], nil];
[myView.layer insertSublayer:gradient atIndex:0];

Per ottenere la tonalità, la saturazione e la luminosità di un colore, utilizzare il selettore colore xcode integrato e andare alla scheda HSB. La tonalità è misurata in gradi in questa vista, quindi dividi il valore per 360 per ottenere il valore che desideri inserire nel codice.

Questo è ciò che ho funzionato: imposta UIButton nell'IB di xCode su trasparente / chiaro e nessuna immagine bg.

UIColor *pinkDarkOp = [UIColor colorWithRed:0.9f green:0.53f blue:0.69f alpha:1.0];
UIColor *pinkLightOp = [UIColor colorWithRed:0.79f green:0.45f blue:0.57f alpha:1.0];

CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = [[shareWordButton layer] bounds];
gradient.cornerRadius = 7;
gradient.colors = [NSArray arrayWithObjects:
                   (id)pinkDarkOp.CGColor,
                   (id)pinkLightOp.CGColor,
                   nil];
gradient.locations = [NSArray arrayWithObjects:
                      [NSNumber numberWithFloat:0.0f],
                      [NSNumber numberWithFloat:0.7],
                      nil];

[[recordButton layer] insertSublayer:gradient atIndex:0];

Lo raggiungo in una vista con una sottoview che è un UIImageView. L'immagine a cui punta ImageView è una sfumatura. Quindi ho impostato un colore di sfondo in UIView e ho una vista a gradiente colorata. Quindi uso la vista come devo fare e tutto ciò che disegno sarà sotto questa vista sfumata. Aggiungendo una seconda vista in cima a ImageView, puoi avere alcune opzioni se il tuo disegno sarà sotto o sopra il gradiente ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top