UIButton Obraz + tekst IOS


129

Potrzebuję UIButtonz obrazem i tekstem . Obraz powinien znajdować się na górze, a tekst pod obrazem, oba powinny być klikalne.


Mam nadzieję, że to pomoże, zobacz [UiButton zarówno z TEKSTEM, jak i OBRAZEM] [1] stackoverflow.com/questions/4926581/ ... [1]: stackoverflow.com/questions/4926581/ ... Następnie możesz dodać UITapGestureRecognizer do swojego widoku, aby obsługiwać custombutton kliknięcia.
Humayun Ghani

22
Brzmi bardziej jak specyfikacja wymagań niż pytanie.
Abizern

Zobacz zaakceptowaną odpowiedź i to commandshift.co.uk/blog/2013/03/12/uibutton-edge-insets about UIButton Edges
onmyway133

Odpowiedzi:


308

Widzę bardzo skomplikowane odpowiedzi, wszystkie przy użyciu kodu. Jeśli jednak używasz Interface Builder , możesz to zrobić w bardzo prosty sposób:

  1. Wybierz przycisk i ustaw tytuł oraz obraz. Zwróć uwagę, że jeśli ustawisz tło zamiast obrazu, rozmiar obrazu zostanie zmieniony, jeśli jest mniejszy niż przycisk.Podstawowy obraz i tytuł IB
  2. Ustaw położenie obu elementów, zmieniając krawędź i wstawki. Możesz nawet kontrolować wyrównanie obu w sekcji Sterowanie.

Zestaw pozycji IB Zestaw IB Control

Możesz nawet użyć tego samego podejścia w kodzie, bez tworzenia w nim UILabels i UIImages, jak w przypadku innych proponowanych rozwiązań. Zawsze zachowuj prostotę!

EDYCJA: Załączam mały przykład z ustawionymi 3 rzeczami (tytuł, obraz i tło) z poprawnymi wstawkami Podgląd przycisku


2
To jest poprawne. Będziesz chciał użyć wstawek krawędzi w tytule i obrazie, aby prawidłowo je wyrównać. Możesz to zrobić w kodzie, ustawiając właściwości titleEdgeInsets i contentEdgeInsets.
Tim Mahoney

4
tak, jest prawie poprawne. po prostu musisz ustawić Backgroundobraz zamiast znaku Image, w przeciwnym razie nie zobaczysz tytułu, nawet nie ustawisz wartości wstawienia, aby zmienić położenie tytułu.
holex

6
Ja też miałem z tym problem. Jeśli tytuł się nie wyświetla, spróbuj ustawić dla niego ujemne lewe przesunięcie. Wygląda na to, że IB automatycznie przesuwa go na prawą stronę obrazu.
brians,

8
To wyświetla tylko obraz i tekst obok siebie, prawda? Czy istnieje sposób na zmianę orientacji z góry na dół? To jest to, co stwierdza pierwotne pytanie i czego również szukam. Dzięki!
flohei,

12
W przypadku osób używających Xcode 8 może nie być widoczna właściwość Edge. Tekst może również zniknąć po dodaniu obrazu. Zmienia tekst na biały, a jeśli jesteś na białym tle, wygląda na to, że zniknął. Zmień kolor tekstu, a pojawi się on blisko obrazu. Możesz dostosować wstawki w Inspektorze rozmiaru.
Micah Montoya

67

Myślę, że szukasz tego rozwiązania swojego problemu:

UIButton *_button = [UIButton buttonWithType:UIButtonTypeCustom];
[_button setFrame:CGRectMake(0.f, 0.f, 128.f, 128.f)]; // SET the values for your wishes
[_button setCenter:CGPointMake(128.f, 128.f)]; // SET the values for your wishes
[_button setClipsToBounds:false];
[_button setBackgroundImage:[UIImage imageNamed:@"jquery-mobile-icon.png"] forState:UIControlStateNormal]; // SET the image name for your wishes
[_button setTitle:@"Button" forState:UIControlStateNormal];
[_button.titleLabel setFont:[UIFont systemFontOfSize:24.f]];
[_button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; // SET the colour for your wishes
[_button setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted]; // SET the colour for your wishes
[_button setTitleEdgeInsets:UIEdgeInsetsMake(0.f, 0.f, -110.f, 0.f)]; // SET the values for your wishes
[_button addTarget:self action:@selector(buttonTouchedUpInside:) forControlEvents:UIControlEventTouchUpInside]; // you can ADD the action to the button as well like

... reszta dostosowania przycisku jest teraz Twoim obowiązkiem i nie zapomnij dodać przycisku do widoku.

UPDATE # 1 i UPDATE # 2

lub, jeśli nie potrzebujesz dynamicznego przycisku, możesz dodać przycisk do swojego widoku w programie Interface Builder i ustawić te same wartości również w tym miejscu. to jest całkiem to samo, ale tutaj jest również ta wersja na jednym prostym obrazku.

możesz również zobaczyć ostateczny wynik w Interface Builder, tak jak jest na zrzucie ekranu.

wprowadź opis obrazu tutaj


EdgeInsets działa tylko wtedy, gdy masz „ustaw obraz przycisku” i kiedy ustawisz obraz przycisku, nie możesz zobaczyć tytułu. A jeśli ustawisz obraz tła, EdgeInsets nie może zastosować do obrazu. i możesz zobaczyć tytuł. Nie możesz więc ustawić edgeinsect na oba jednocześnie.
Badal Shah,

@BadalShah, tak, są pewne scenariusze (w zależności od rozmiaru przycisku, rozmiaru obrazu, długości tytułu itp.), Kiedy to, co powiedziałeś, jest prawdą i nie możesz zobaczyć tytułu i obrazu w tym samym czasie, ponieważ obraz wypycha tytuł widocznego obszaru; ale ten scenariusz wcale nie jest ogólny, ogólna sytuacja jest taka, że ​​zarówno tytuł, jak i obraz mogą i będą pojawiać się w tym samym czasie.
holex

32

Xcode-9 i Xcode-10 Apple dokonały teraz kilku zmian dotyczących Edge Inset, możesz to zmienić w inspektorze rozmiaru.

Wykonaj poniższe kroki:

Krok 1: Wprowadź tekst i wybierz obraz, który chcesz pokazać:

wprowadź opis obrazu tutaj

Krok 2: Wybierz sterowanie przyciskiem zgodnie z wymaganiami, jak pokazano na poniższym obrazku:

wprowadź opis obrazu tutaj

Step-3: Teraz przejdź do inspektora rozmiaru i dodaj wartość zgodnie z wymaganiami:

wprowadź opis obrazu tutaj


9
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.imageView.image = [UIImage imageNamed:@"your image name here"];
button.titleLabel.text = @"your text here";

ale poniższy kod pokaże etykietę powyżej i obraz w tle

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.background.image = [UIImage imageNamed:@"your image name here"];
button.titleLabel.text = @"your text here";

Nie ma potrzeby używania etykiety i przycisku w tej samej kontrolce, ponieważ UIButton ma właściwości UILabel i UIimageview.


1
Muszę ustawić obraz na górze, a tekst pod obrazem oba powinny być klikalne ..
Codesen

4

Użyj tego kodu:

UIButton *button=[UIButton buttonWithType:UIButtonTypeRoundedRect];
    button.imageView.frame=CGRectMake(0.0f, 0.0f, 50.0f, 44.0f);///You can replace it with your own dimensions.
    UILabel *label=[[UILabel alloc] initWithFrame:CGRectMake(0.0f, 35.0f, 50.0f, 44.0f)];///You can replace it with your own dimensions.
    [button addSubview:label];

4

Użyj tego kodu:

UIButton *sampleButton = [UIButton buttonWithType:UIButtonTypeCustom];
[sampleButton setFrame:CGRectMake(0, 10, 200, 52)];
[sampleButton setTitle:@"Button Title" forState:UIControlStateNormal];
[sampleButton setFont:[UIFont boldSystemFontOfSize:20]];
[sampleButton setBackgroundImage:[[UIImage imageNamed:@"redButton.png"] 
stretchableImageWithLeftCapWidth:10.0 topCapHeight:0.0] forState:UIControlStateNormal];
[sampleButton addTarget:self action:@selector(buttonPressed)
forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:sampleButton]

4

Napotkałem ten sam problem i naprawiam go, tworząc nową podklasę UIButtoni zastępując layoutSubviews:metodę, jak poniżej:

-(void)layoutSubviews {
    [super layoutSubviews];

    // Center image
    CGPoint center = self.imageView.center;
    center.x = self.frame.size.width/2;
    center.y = self.imageView.frame.size.height/2;
    self.imageView.center = center;

    //Center text
    CGRect newFrame = [self titleLabel].frame;
    newFrame.origin.x = 0;
    newFrame.origin.y = self.imageView.frame.size.height + 5;
    newFrame.size.width = self.frame.size.width;

    self.titleLabel.frame = newFrame;
    self.titleLabel.textAlignment = UITextAlignmentCenter;

}

Myślę, że odpowiedź Angel García Olloqui jest kolejnym dobrym rozwiązaniem, jeśli umieścisz je ręcznie za pomocą narzędzia do tworzenia interfejsu, ale zachowam swoje rozwiązanie, ponieważ nie muszę modyfikować wstawek zawartości dla każdego przycisku.


4

Utwórz UIImageViewi UILabel, ustaw obraz i tekst na oba te elementy .... a następnie umieść niestandardowy przycisk nad imageView i etykietą ....

UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"search.png"]];
    imageView.frame = CGRectMake(x, y, imageView.frame.size.width, imageView.frame.size.height);
    [self.view addSubview:imageView];

UILabel *yourLabel = [[UILabel alloc] initWithFrame:CGRectMake(x, y,a,b)];
yourLabel.text = @"raj";
[self.view addSubview:yourLabel];

UIButton * yourBtn=[UIButton buttonWithType:UIButtonTypeCustom];
[yourBtn setFrame:CGRectMake(x, y,c,d)];
[yourBtn addTarget:self action:@selector(@"Your Action") forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:yourBtn];  

Proste i użyteczne. Jak ustawić podświetlony obraz i tytuł?
DawnSong

for lable setHighlightedTextColor i musisz grać z forControlEvents
Rajneesh071

3

Powinieneś utworzyć niestandardowy widok obrazu dla obrazu i własną etykietę dla tekstu i dodać do przycisku jako podglądy. Otóż ​​to.

UIButton *yourButton = [UIButton buttonWithType:UIButtonTypeCustom];
yourButton.backgroundColor = [UIColor greenColor];
yourButton.frame = CGRectMake(140, 40, 175, 30);     
[yourButton addTarget:self action:@selector(yourButtonSelected:) forControlEvents:UIControlEventTouchUpInside]; 
[self.view addSubview:yourButton];

UIImageView *imageView1 = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, yourButton.frame.size.width, yourButton.frame.size.height/2)];
imageView1.image =[UIImage imageNamed:@"images.jpg"];
[yourButton addSubview:imageView1];

UILabel *label=[[UILabel alloc] initWithFrame:CGRectMake(0, yourButton.frame.size.height/2, yourButton.frame.size.width, yourButton.frame.size.height/2)];
label.backgroundColor = [UIColor greenColor];
label.textAlignment= UITextAlignmentCenter;
label.text = @"ButtonTitle";
[yourButton addSubview:label];

Do celów testowych użyj yourButtonSelected:metody

-(void)yourButtonSelected:(id)sender{
    NSLog(@"Your Button Selected");

}

Myślę, że to ci pomoże.


3

To naprawdę proste, po prostu dodaj obraz do tła swojego przycisku i nadaj tekstowi tytuł etykiety przycisku, aby uicontrolstatenormal. Otóż ​​to.

[btn setBackgroundImage:[UIImage imageNamed:@"img.png"] forState:UIControlStateNormal];
[btn setContentVerticalAlignment:UIControlContentVerticalAlignmentBottom];
[btn setTitle:@"Click Me" forState:UIControlStateNormal];

4
... a jak wygląda tekst pod obrazem?
holex

@holex: Dziękuję bardzo za kierowanie mną, znalazłem w tym błąd i odpowiednio się zmieniłem.
Dhruv

1

szybka wersja:

var button = UIButton()

newGameButton.setTitle("Новая игра", for: .normal)
newGameButton.setImage(UIImage(named: "energi"), for: .normal)
newGameButton.backgroundColor = .blue
newGameButton.imageEdgeInsets.left = -50

wprowadź opis obrazu tutaj

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.