2008-09-23 13 views
7

Jestem w trakcie dodawania niestandardowych przycisków do mojego interfejsu użytkownika iPhone'a i chcę, aby miały szklisty wygląd z aplikacji Apple. Mam dobry domyślny szklany obraz, ale nie chciałbym mieć osobnego obrazu dla każdego odcienia, jaki chcę (czerwony, zielony, niebieski itp.).Jak zabarwić Uibutton?

Czy istnieje sposób na załadowanie PNG w odcieniach szarości i dostosowanie go do koloru, który chcę? Co więcej, czy istnieje sposób na uzyskanie szklistego wyglądu Apple bez konieczności ładowania niestandardowych obrazów?

Odpowiedz

2

Nie ma jedno-liniowego sposobu, jaki znam, ale można uzyskać pożądany efekt, przyjmując domyślny obraz w skali szarości i komponując go (tzn. Rysując go na wierzchu) w jednolitym kolorze. Jeśli przejrzysz dokumentację Core Graphics, możesz zauważyć, że istnieje kilkanaście różnych metod kompozycyjnych (np. Color Burn), a niektóre ich kombinacje mogą dawać pożądany efekt.

0

skończyło się tworząc własną niestandardową przycisk, który dokładnie pasuje do renderowania używany w przycisk „Usuń kontakt” w widoku kontaktów edycji.

Dla zainteresowanych, można je znaleźć na github na

PFTintedButton

7

Trochę późno, ale w przypadku kogoś takiego jak ja szuka tego rodzaju informacji: używać UISegmentedControl za pomocą jednego przycisku, ustaw to jako momentary i ustaw jego tintColor. W ten sposób nie musisz przygotowywać tylu plików PNG, ile masz kolorów, a struktura dba o renderowanie.

Przykład:

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]; 
+0

Podczas gdy jest to miłe i już wiedziałem o tym, to tak naprawdę nie działa dla mnie, ponieważ chcę, aby mój UIBarButtonItem utrzymywał właściwości paska narzędziowego paska narzędzi i jak tylko wprowadzisz niestandardowy widok z Uibuttonem, to jest już okno AFAIK. Wszystko, co chcę zrobić, to zmienić kolor tekstu :( –

+0

wspaniała odpowiedź bez użycia png. – andyPaul

+1

Jedna uwaga: tworzy przycisk, który nie działa tak jak przycisk - uruchamia swoje zdarzenie, gdy użytkownik zaczyna kran, zamiast wydawania (np. touchUpInside) Niestety wydarzenie UIControlEventTouchUpInside wydaje się być połknięte przez Cocoa, a dodanie do niego celu na podzielonym na segmenty formantu nie działa. –

0

Zrobiłem to i to działa całkiem przyjemnie:

iOS: Applying a RGB filter to a greyscale PNG

Jednak jest oszustwo, to jest dodawanie, tak dla (np) czerwonej składowej każdego piksela, R_dest = R_src + R_tint

Jeśli chcesz precyzyjnie sterować, na przykład możesz wyodrębnić wartość skali szarości dla każdego piksela przez uśredniając komponenty RGB (z odpowiednim współczynnikiem ważenia), a następnie pomnożymy tę wartość przez odcień, więc uzyskany kolor będzie miał skalę szarości (Sr, Sg, Sb) * {Tr, Tg, Tb}

Wymagałoby to utworzenia fragment pamięci, tworzenie kontekstu bitmapowego, który wciąga do tego kawałka, wciąganie obrazu w ten kontekst, kopiowanie całej porcji pamięci na bezpieczne przechowywanie, przetwarzanie - pobieranie danych z kopii i modyfikowanie oryginalnego magazynu kopii zapasowych, a następnie wyodrębnianie obrazu z oryginalny sklep z aplikacjami i uwolnienie wszystkiego, co przydzielono.

Problem reconstituting UIImage from RGBA pixel byte data

Ta biblioteka zrobiła wszystko dla ciebie, to nie jest to najbardziej efektywna trasa, ale dostaje zadanie. iirc używa malloc, kiedy powinien używać calloc.