2009-07-12 21 views
28

Mam numer UIButton i próbuję ustawić na nim tytuł i obraz.Pytanie o tytuł i zapytanie o wyrównywanie UIButton

Chciałbym wyrównać tytuł dla UIButton po lewej stronie i umieścić obraz wyrównany w prawo. Próbuję uzyskać wygląd przycisku odtwarzacza Timer w aplikacji Zegary (ten, który mówi "Kiedy zegar się kończy").

I bawił contentHorizontalAlignment, contentEdgeInsetstitleEdgeInsets i imageEdgeInsets, aby osiągnąć swój cel, ale bezskutecznie. Dokumentacja jest również dość skąpa dla tego samego.

Jak mogę osiągnąć to samo?

Pytania pokrewne, Zegar w aplikacji Zegary ma dwa zestawy tekstu, jeden wyrównany w lewo i drugi wyrównany do prawej z obrazem? Jak to zrobić w UIButton? (W tej chwili nie potrzebuję tej funkcjonalności).

Odpowiedz

35

zmienić właściwość imageEdgeInsets na UIButton a potem po prostu użyć setImage:forState:

+1

To jest właściwy sposób, aby to zrobić, jeśli używasz Uibutton. widoki stołów to inna bestia. –

+5

Zgadzam się, ale OP nie wspomniał o widokach tabeli :) – Bill

9

Pamiętaj, że UIButton dziedziczy z UIView, więc możesz dodawać do niego subviews, tak jak każdy inny widok. W tej sytuacji, należy utworzyć przycisk, a następnie dodać UILabel na lewym boku i UIImage po prawej:

// Create the button 
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 

// Now load the image and create the image view 
UIImage *image = [UIImage imageNamed:@"yourImage.png"]; 
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(/*frame*/)]; 
[imageView setImage:image]; 

// Create the label and set its text 
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(/*frame*/)]; 
[label setText:@"Your title"]; 

// Put it all together 
[button addSubview:label]; 
[button addSubview:imageView];
+0

To nie wydaje się działać zbyt dobrze. Mam przycisk tła na przycisku, a etykieta nie jest widoczna, jeśli ustawię obraz tła.Jeśli usunę obraz tła z przycisku, etykieta stanie się widoczna? Dodałem etykietę do nadrzędnego widoku UIButton i wyrównano, aby usiąść na UIButtonie i działa wtedy. Każdy pomysł, dlaczego to zachowuje się w ten sposób? – siasl

+2

Zwykle takie zachowanie pojawia się, gdy obraz tła jest dodawany jako widok podrzędny UIButtonu w górnej części niestandardowych widoków. Zamiast ustawiać właściwość backgroundImage przycisku, pomyśl o dodaniu samego UIImageView dla obrazu tła, a następnie dodaniu innej niestandardowej treści na górze tego widoku obrazu. – Tim

+0

Nie ma potrzeby rozwijania własnej logiki - użyj właściwości 'imageEdgeInsets' na Uibutton i' setImage: forState: '. – Bill

47

Oto kod używam do tego:

//Right-align the button image 
CGSize size = [[myButton titleForState:UIControlStateNormal] sizeWithFont:myButton.titleLabel.font]; 
[myButton setImageEdgeInsets:UIEdgeInsetsMake(0, 0, 0, -size.width)]; 
[myButton setTitleEdgeInsets:UIEdgeInsetsMake(0, 0, 0, myButton.imageView.image.size.width + 5)]; 
+0

To jest IMO nieco lepsza, jeśli nieco zbyt zwięzła, odpowiedź przy użyciu kodu kontra głosowana odpowiedź @Bill, która mówi, aby użyć tych wywołań interfejsu API, ale nie robi " t pokaż je wołając. Byłoby lepiej, gdyby pokazał wywołanie setImage: forState :. Ponadto znalazłem w niektórych przypadkach, jak actionSheets, które po ustawieniu imageImageEdgeInsets nie wymagają korekty titleEdgeInsets - uwzględniły już szerokość obrazu. YMMV. – natbro

+3

Jeśli ustawisz "contentHorizontalAlignment" na "UIControlContentHorizontalAlignmentRight", musisz również dodać wstawkę po lewej stronie w "titleEdgeInsets". to: '[myButton setTitleEdgeInsets: UIEdgeInsetsMake (0 -imageSize.width, 0 imageSize.width)]; ' – vilanovi

-2

utworzyć podklasę UIButton i zastąpić swoją layoutSubviews sposób, aby dostosować swój tekst & obrazu programowo. Lub użyj czegoś w stylu https://github.com/stevestreza/BlockKit/blob/master/Source/UIView-BKAdditions.h, aby zaimplementować layoutSubviews za pomocą bloku.

+0

Odniesienie do piasty git nie działa –

+0

https://github.com/stevestreza/BlockKit/ blob/master/Źródło/UIView-BKAdditions.h –

+0

Dziękujemy za aktualizację linku :). Teraz działa –

13

Poniższy kod działa:

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
button.frame = buttonRect; 
[button setTitle:@"A title" forState:UIControlStateNormal]; 
[button setImage:buttonImage forState:UIControlStateNormal]; 
button.imageEdgeInsets = UIEdgeInsetsMake(0.0, WIDTH(button.titleLabel) + 10.0, 0.0, 0.0); 
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft; 
4

Można również zastąpić titleRectForContentRect: i imageRectForContentRect: metod UIButton w pozycji zlecenia tekstu i obrazu w dowolnym miejscu.

1

Oto podklasa UIButton w Swift, która wyrównuje obraz po lewej stronie i tekst w środku. Ustaw imageLeftInset na żądaną wartość.

class LeftImageAlignedButton : UIButton { 

var imageLeftInset : CGFloat = 10.0 

override func layoutSubviews() { 
    super.layoutSubviews() 
    self.contentHorizontalAlignment = .Left 
    if let font = titleLabel?.font { 
     let textWidth = ((titleForState(state) ?? "") as NSString).sizeWithAttributes([NSFontAttributeName:font]).width 
     let imageWidth = imageForState(state)?.size.width ?? 0.0 
     imageEdgeInsets = UIEdgeInsets(top: 0, left: imageLeftInset, bottom: 0, right: 0) 
     titleEdgeInsets = UIEdgeInsets(top: 0, left: bounds.width/2 - textWidth/2.0 - imageWidth, bottom: 0, right: 0) 
    } 
} 
} 
4

w Swift dla każdego, kto troszczy się (z odstępem 10pt):

let size = (self.titleForState(UIControlState.Normal)! as NSString).sizeWithAttributes([NSFontAttributeName:self.titleLabel!.font]) 
let offset = (size.width + 10) 
self.imageEdgeInsets = UIEdgeInsetsMake(0, offset, 0, -offset) 
self.titleEdgeInsets = UIEdgeInsetsMake(0, 0, 0, self.imageView!.frame.size.width + 10) 
4

za pomocą na iOS 9, próbowałem wiele odpowiedzi w tym wątku, ale żaden z nich nie nadaje się do mnie. Znalazłem odpowiedź dla siebie następująco:

class MyButton: UIButton { 

    override func layoutSubviews() { 
    super.layoutSubviews() 

    self.contentHorizontalAlignment = UIControlContentHorizontalAlignment.Left 

    if self.imageView?.image != nil { 
     // Move icon to right side 
     self.imageEdgeInsets = UIEdgeInsets(
     top: 0, 
     left: self.bounds.size.width - self.imageView!.image!.size.width, 
     bottom: 0, 
     right: 0) 

     // Move title to left side 
     self.titleEdgeInsets = UIEdgeInsetsMake(0, -self.imageView!.frame.size.width + 8, 0, 0) 

    } 
    } 
} 

SWIFT 3:

class MyButton: UIButton { 

    override func layoutSubviews() { 
     super.layoutSubviews() 

     self.contentHorizontalAlignment = UIControlContentHorizontalAlignment.left 

     if self.imageView?.image != nil { 
      // Move icon to right side 
      self.imageEdgeInsets = UIEdgeInsets(
       top: 0, 
       left: self.bounds.size.width - self.imageView!.image!.size.width, 
       bottom: 0, 
       right: 0) 

      // Move title to left side 
      self.titleEdgeInsets = UIEdgeInsetsMake(0, -self.imageView!.frame.size.width + 8, 0, 0) 

     } 
    } 
} 

Mam nadzieję, że pomoże to w przypadku kogoś jak ja!

+1

Świetna robota, ja Zaktualizuję ci Swift 3 –