Domanda

Sono in procinto di aggiungere pulsanti personalizzati all'interfaccia utente del mio iPhone e voglio farli avere l'aspetto vetroso delle app di Apple. Ho una buona immagine di vetro predefinita, ma odio doverne avere un'immagine separata per ogni tinta che desidero (rosso, verde, blu, ecc.).

Esiste un modo per caricare un PNG in scala di grigi e regolarlo sul colore desiderato? Meglio ancora, c'è un modo per ottenere l'aspetto vetroso di Apple senza dover caricare immagini personalizzate?

È stato utile?

Soluzione

Non esiste un modo a una riga che io conosca, ma potresti essere in grado di ottenere l'effetto desiderato prendendo l'immagine in scala di grigi predefinita e componendola (cioè disegnandola sopra) con un colore solido. Se guardi attraverso la documentazione di Core Graphics, puoi vedere che ci sono più di una dozzina di diversi metodi di composizione (ad esempio, Color Burn) e alcune combinazioni di questi possono produrre l'effetto desiderato.

Altri suggerimenti

Un po 'in ritardo, ma nel caso qualcuno come me cerchi questo tipo di informazioni: usa un UISegmentedControl con un solo pulsante, impostalo come momentaneo e imposta il suo tintColor . In questo modo, non è necessario preparare tutti i PNG quanti sono i colori e il framework si occupa di tutto il rendering per te.

Esempio:

UISegmentedControl *cancelButton = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObject:@"Cancel"]];
[cancelButton setSegmentedControlStyle:UISegmentedControlStyleBar];
[cancelButton setTintColor:[UIColor colorWithRed:0.8 green:0.3 blue:0.3 alpha:1.0]];
[cancelButton setMomentary:YES];
[cancelButton addTarget:self action:@selector(didTapCancel:) forControlEvents:UIControlEventValueChanged];
[self addSubview:cancelButton];
[cancelButton release];

C'è un esempio al sempre eccellente "Cocoa With Love" site: Disegnare sfumature di brillantezza in CoreGraphic

Non conosco l'interfaccia utente di iPhone, ma puoi utilizzare un singolo PNG per avere una grafica con varianti di colore.

vale a dire. Entrambi i loghi (in alto a sinistra) su queste pagine:

Prodotti

Negozi

Usa questo PNG

alt text http://47degrees.com/images/logos/47_degrees.png

Suppongo che potrebbe essere necessario impostare il colore di sfondo come una tinta per essere vetroso.

L'ho fatto e funziona abbastanza bene:

iOS: applicazione di un filtro RGB a un PNG in scala di grigi

Tuttavia, sta barando, sta aggiungendo, quindi per (ad esempio) il componente rosso di ogni pixel, R_dest = R_src + R_tint

Se si desidera un controllo a grana fine, ad esempio, è possibile che si desideri estrarre il valore di scala di grigi per ciascun pixel facendo la media dei componenti RGB (con ponderazione appropriata), quindi moltiplicare questo valore per la tinta, quindi il colore risultante sarebbe scala di grigi (Sr, Sg, Sb) * {Tr, Tg, Tb}

Ciò richiederebbe la creazione di un blocco di memoria, la creazione di un contesto bitmap che si inserisce in questo blocco, il disegno dell'immagine in questo contesto, la copia dell'intero blocco di memoria per la conservazione, l'elaborazione, il recupero dei dati dalla copia e la modifica del supporto originale store, quindi estraendo un'immagine dal backing store originale e liberando tutto ciò che hai allocato.

Problema nella ricostituzione di UIImage da dati di byte pixel RGBA

Questa libreria ha fatto tutto per te, non è la strada più efficiente, ma fa il lavoro. iirc usa malloc quando dovrebbe usare calloc.

Ho finito per creare il mio pulsante personalizzato che si avvicina molto al rendering utilizzato in " Elimina contatto " nella vista di modifica dei contatti.

Per chi fosse interessato, può essere trovato su github all'indirizzo

PFTintedButton

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