2009-08-05 9 views

Odpowiedz

25

Domyślam się, że obraz tła nie jest uważany za "treść" przez Uibutton, więc tryb zawartości nie miał zastosowania do obrazu tła. Zamiast ustawić obraz przycisku i to działało w porządku:

[btn setImage:[[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"dots_game_horiz_blue" ofType:@"png"]] forState:UIControlStateNormal]; 
[btn setContentMode:UIViewContentModeCenter]; 
+2

Problem z tym rozwiązaniem polega na tym, że UIButton ma wewnętrzny margines, więc jeśli obraz nie jest wystarczająco mały, zostanie przycięty, nawet jeśli powinien się zmieścić wewnątrz przycisku. –

+3

Ustawienie trybu zawartości w rzeczywistości nic tutaj nie robi.Obrazy przycisków są automatycznie wycentrowane i nie są skalowane. Spróbuj ustawić wszystko, ale nie wyśrodkuj i zobacz, co mam na myśli. –

+2

+1 Jednak niestety, jeśli chcesz mieć tekst, a także obraz, to nie będzie działać :-( – Marc

5

Można również wdrożyć - (CGRect)backgroundRectForBounds:(CGRect)bounds kontrolować jak tło jest narysowany.

+3

To zadziałało dla mnie. Tworzę niestandardową klasę UIButton, a ja użyłem tego kodu do wyśrodkowania obrazu: '- (CGRect) backgroundRectForBounds (CGRect) granice { \t UIImage * bkgImage = [siebie backgroundImageForState: self.state]; \t if (bkgImage) { \t \t CGFloat x = floorf ((self.bounds.size.width-bkgImage.size. szerokość)/2); \t \t CGFloat y = floorf ((self.bounds.size.height-bkgImage.size.height)/2); \t \t return CGRectMake (x, y, bkgImage.size.width, bkgImage.size.height); \t} \t else return [super backgroundRectForBounds: bounds]; } ' –

+0

Rozwiązanie" Overkill "imo. Możesz po prostu ustawić ramkę dla przycisku, taką jak: UIImage * img = [UIImage imageNamed: @ "dots_game_horiz_blue.png"]; [btn setBackgroundImage: img forState: UIControlStateNormal]; btn.frame = CGRectMake (0, 0, img.size.width, img.size.height); – Tony

0

Potrzebowałem utworzyć zaokrąglone guziki do zdjęć awatara i znalazłem odpowiedzi na to pytanie, ale nie dotarły one do mnie. Wdrożyłem metodę backgroundRectForBounds i skalowałem obraz, aby pasował i działa dobrze.

Mam kod na GitHub.

https://github.com/brennanMKE/CircleButton

Sposób jest również poniżej. Ważne jest, aby ustawić obraz tła, a nie obraz przycisku, który nie działa z tą metodą.

- (CGRect)backgroundRectForBounds:(CGRect)bounds { 
    UIImage *backgroundImage = [self backgroundImageForState:self.state]; 
    if (backgroundImage) { 
     CGFloat maxWidth = CGRectGetWidth(self.frame); 

     CGFloat xDelta = maxWidth/backgroundImage.size.width; 
     CGFloat yDelta = maxWidth/backgroundImage.size.height; 
     CGFloat delta = xDelta > yDelta ? xDelta : yDelta; 

     CGFloat x = floorf((self.bounds.size.width - (backgroundImage.size.width * delta))/2); 
     CGFloat y = floorf((self.bounds.size.height - (backgroundImage.size.height * delta))/2); 

     return CGRectMake(x, y, backgroundImage.size.width * delta, backgroundImage.size.height * delta); 
    } 
    else { 
     return [super backgroundRectForBounds:bounds]; 
    } 
} 
1

Prawidłowym rozwiązaniem jest zmiana typu z System na Niestandardowy. Następnie obraz tła honoruje typ zawartości zamiast tylko centrowania. W moim przypadku ustawiłem go na Aspect Fill i stosuję promień naroża 45 stopni, aby go zaokrąglić. Prosty i działa idealnie.

+0

To nie działa. Stworzyłem nowy niestandardowy przycisk i ustawiłem jego tryb zawartości na Środek, ale nadal wypełnia obraz tła do rozmiaru widoku. – devios1

11

W swojej XIB/ujęć, w Inspektorze Atrybuty, trzeba:

  1. Ustaw typ UIButton do Custom
  2. Ustaw swój obraz w nieruchomości Image, nie Background
  3. Members krok 2 , widać ramkę przycisku zmienioną zgodnie z ustawionym obrazem. Ustaw kadr, jak chcesz go mieć, obraz będzie się zmieniać rozmiar, aby zmieścić się
  4. Select Image dla właściwości Edge w celu zastosowania wstawka na przycisk obrazu
  5. wprowadzić wartości wkładce potrzebujesz. Jeśli zestaw 5 do Top, Bottom, Left, Right, obraz zostanie wyśrodkowany wewnątrz przycisku, z obramowaniem 5

Widać zmiany w XI b/widoku serii ujęć, nie ma potrzeby, aby uruchomić do debugowania.

Wskazówka: blat jest taka sama dla wszystkich obrazów przycisku (State Config)

+1

Wszystko, co zaczyna się od 'W twoim xib/storyboard', nie jest rozwiązaniem dla tego pytania: D – Magoo

+0

Do tej pory rozwiązanie ewoluowało. Możesz pominąć krok 4 i przejść do kroku 5 przez inspektora rozmiarów (ikona reguły). –

Powiązane problemy