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.

Codesen
źródło
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

Angel G. Olloqui
źródło
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

holex
źródło
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

Alok
źródło
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.

Vinodh
źródło
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];
Programista iPhone'a
źródło
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]
Hemant Dixit
źródło
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.

Oyashiro
źródło
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];  
Rajneesh071
źródło
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.

Prasad G
źródło
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];
Dhruv
źródło
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

aturan23
źródło