2011-12-29 9 views
25

Podczas używania opcji resizableImageWithCapInsets: w celu utworzenia obrazu dla UIButton jest tylko stan normalny (stan ustaw obraz przy użyciu funkcji setBackgroundImage: forState:) Prace. Wszystkie inne stany pokazują przerwę zamiast rysowanego obrazu. UIButton mówi, że jeśli żaden obraz nie jest ustawiony dla określonego stanu, obraz stanu normalnego zostanie użyty z nakładką dla stanów wyłączonych i wybranych.Używanie opcji resizableImageWithCapInsets: obraz przycisku działa tylko dla zestawu stanów, inne stany przedstawiają "przerwę"

Oto stan normalny:

enter image description here

Oto wybrany stan:

enter image description here

A oto obraz źródłowy:

enter image description here

Wyraźnie jest to obraz skalowalny, który dostarczyłem, ale obraz nie rysuje obszaru o zmienionym rozmiarze. (Możesz zobaczyć lewą i prawą krawędź, ale środkowy obszar, który ma zostać rozciągnięty, nie jest narysowany).

Co ciekawe, stretchableImageWithLeftCapWidth: topCapHeight: działa. Jest to przestarzała metoda w iOS 5, ale z tą różnicą, która pojawia się w nowym interfejsie API, mogę zostać zablokowana.

Rozumiem, że mogę dostarczyć więcej zdjęć dla każdego stanu, ale to pokonuje cel, jaki próbuję osiągnąć, aby zmniejszyć ślad pamięci oraz dodatkowo uzależnić od mojego grafika, którego chciałbym uniknąć.

// This is the gist of the code being used 
UIImage* image = [UIImage imageNamed:@"button.png"]; 
UIEdgeInsets insets = UIEdgeInsetsMake(image.size.height/2, image.size.width/2, image.size.height/2, image.size.width/2); 
image = [image resizableImageWithCapInsets:insets]; 
[self.button setBackgroundImage:image forState:UIControlStateNormal]; 
// Even doing the following results in the same behaviour 
[self.button setBackgroundImage:image forState:UIControlStateSelected]; 
+0

Dodałem fragment kodu i przechowywano zrzuty ekranów (przycięte do odpowiedniego obszaru). – NSProgrammer

+0

To jest dziwne ... Chciałbym aby zobaczyć przycisk.png, jeśli moglibyśmy. –

+0

http://i40.tinypic.com/ea35zq.png - Mogę dodać tylko 2 linki do postu jako nowego użytkownika, ale tutaj jest przycisk sourece.png – NSProgrammer

Odpowiedz

34

Nie tworzysz prawidłowo wypustek do zamaskowania obrazu. Odtworzyłem Twój problem i poprawiłem go, używając prawidłowych wypustek.

Przy bieżącym kodzie tworzysz czapki o połowie wysokości i szerokości obrazu - pozostawia to obszar "rozciągalny" o wielkości 0x0 pikseli - dzięki temu nie uzyskasz niczego pośrodku.

Dlaczego to nie jest wyświetlane jako niepoprawne w normalnym stanie przycisku Nie jestem pewien - być może jest jakaś optymalizacja wbudowana w Uibutton w celu naprawienia rzeczy lub automatycznego streszczenia, jeśli nie dostarczasz rozciągliwego obraz, a to nie dotyczy innych stanów.

Nakładki mają określać obszar obrazu, który nie może być rozciągnięty. W przypadku obrazu button.png jest to 6 pikseli po lewej i prawej stronie i 16 pikseli od góry i dołu. To nie jest standardowe, powinieneś powiedzieć projektantowi graficznemu, że (przynajmniej dla lewej strony prawej, która jest najczęściej rozciąganiem), powinieneś mieć tylko obszar 1px w środku, ale to nie ma wpływu na wynik. Jeśli masz rozciągliwy obszar 1px, możesz ujednolicić swój kod, wyprowadzając nasadki z rozmiaru obrazu, tak jak próbowałeś w pytaniu (każda czapka jest wtedy (image.size.height - 1)/2 dla góry/dołu, tak samo, ale o szerokości dla lewej/prawej strony).

Aby uzyskać poprawne obrazy na przycisku, należy użyć następującego kodu do tworzenia rozciągliwej obraz:

UIEdgeInsets insets = UIEdgeInsetsMake(16, 6, 16, 6); 
image = [image resizableImageWithCapInsets:insets]; 
+0

+1 moja logika zdecydowanie tego nie wyjaśnia. Poprzez obcięcie wartości krawędzi. 'truncf ((image.size.height - 1)/2.0)' mój obraz zmienia się poprawnie. Kudos to jrturton – NSProgrammer

+1

Połapanie wielkiej uwagi, należy zauważyć, że iOS6 powtórzy piksel, w którym spotykają się dwa wstawki, co powoduje błąd podobny do systemu iOS 5. – tapi

0

I miał problemy podczas korzystania na iOS5 zbyt skalowalne obrazów. Okazuje się, że jeśli twój przycisk jest typu "RountedRect" i manipulujesz obrazkami tła, obrazy z możliwością zmiany rozmiaru nie zachowują się zgodnie z oczekiwaniami.(iOS6 radzi sobie z tym dobrze, prawdopodobnie zakładając nowy typ przycisku i dostosowując go w razie potrzeby.)

+0

Opisany problem dotyczył stylu przycisku "Niestandardowy". – NSProgrammer

Powiązane problemy