Ustawianie obrazu dla kodu UIButton w kodzie

196

Jak ustawić obraz dla kodu UIButton w kodzie?

Mam to:

UIButton *btnTwo = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
btnTwo.frame = CGRectMake(40, 140, 240, 30);
[btnTwo setTitle:@"vc2:v1" forState:UIControlStateNormal];
[btnTwo addTarget:self action:@selector(goToOne) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btnTwo];

ale nie widzę, co ustawi dla niego obraz.

Spanky
źródło

Odpowiedzi:

398

Cel C

UIImage *btnImage = [UIImage imageNamed:@"image.png"];
[btnTwo setImage:btnImage forState:UIControlStateNormal];

Swift 5.1

let btnImage = UIImage(named: "image")
btnTwo.setImage(btnImage , for: .normal)
Mike W.
źródło
1
Na marginesie: pokaże obraz, ale tekst tytułu przycisku zostanie ukryty.
lewiatan
Ten kod działa w pełni, ale otrzymuję obraz z analizą składni, więc jak mogę to zrobić, ponieważ ten kod działa dla mnie w przypadku UIImage: - largePick.image = aNewsInfo.smallImageData; jak mogę to zrobić za pomocą UIButton ... Czy możesz mi pomóc ...
user755278
1
@ slott, gdzie dokumentacja to mówi ? Nie widzę, aby sugerowało to, że setImagejest przestarzałe. (Wydaje mi się, że mylisz się UIButton.setImagez tym UITableViewCell.image, co zostało stwierdzone jako przestarzałe).
Kirk Woll
12
Uwaga: Jeśli użyjesz czegoś innego niż UIButtonTypeCustom, obraz będzie niebieski w iOS7 i 8.
Apfelsaft
2
Dla Swift 3: btnTwo.setImage (btnImage, dla: UIControlState.normal)
Micah Montoya
57

Rozwiązanie Mike'a po prostu pokaże obraz, ale jakikolwiek tytuł ustawiony na przycisku nie będzie widoczny, ponieważ można ustawić tytuł lub obraz.

Jeśli chcesz ustawić oba (obraz i tytuł), użyj następującego kodu:

btnImage = [UIImage imageNamed:@"image.png"];
[btnTwo setBackgroundImage:btnImage forState:UIControlStateNormal];
[btnTwo setTitle:@"Title" forState:UIControlStateNormal];
lewiatan
źródło
2
jaka jest różnica między setImage a setBackgroundImage ?
onmyway133,
3
setBackgroundImage rozciągnie obraz na całej szerokości przycisku nad tekstem tytułowym, natomiast setImage sprawi, że przycisk będzie obrazem ignorującym tekst tytułowy bez rozciągania obrazu.
Ernest,
21

Zanim to zadziałało, musiałem wyraźnie zmienić rozmiar ramki przycisku na podstawie rozmiaru ramki obrazu.

UIImage *listImage = [UIImage imageNamed:@"list_icon.png"];
UIButton *listButton = [UIButton buttonWithType:UIButtonTypeCustom];

// get the image size and apply it to the button frame
CGRect listButtonFrame = listButton.frame;
listButtonFrame.size = listImage.size;
listButton.frame = listButtonFrame;

[listButton setImage:listImage forState:UIControlStateNormal];
[listButton addTarget:self.navigationController.parentViewController 
               action:@selector(revealToggle:) 
     forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *jobsButton = 
  [[UIBarButtonItem alloc] initWithCustomView:listButton];

self.navigationItem.leftBarButtonItem = jobsButton;
jrasmusson
źródło
@jrasmusson chciał tylko dodać, że 3 wiersze majstrowania przy ramce można również zapisać w[listButton sizeToFit]
bk138
10

W przypadku Swift User

// case of normal image
let image1 = UIImage(named: "your_image_file_name_without_extension")!
button1.setImage(image1, forState: UIControlState.Normal) 

// in case you don't want image to change when "clicked", you can leave code below
// case of when button is clicked
let image2 = UIImage(named: "image_clicked")!
button1.setImage(image2, forState: UIControlState.Highlight) 
Sruit A.Suk
źródło
9

Możesz to zrobić w ten sposób

[btnTwo setImage:[UIImage imageNamed:@"image.png"] forState:UIControlStateNormal];
Azhar
źródło
9
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.frame = CGRectMake(0, 0, 150, 44);
[btn setBackgroundImage:[UIImage imageNamed:@"buttonimage.png"] 
               forState:UIControlStateNormal];
[btn addTarget:self 
     action:@selector(btnSendComment_pressed:) 
     forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
Gaurav Gilani
źródło
8

Możesz umieścić obraz w dowolny sposób:

UIButton *btnTwo = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
btnTwo.frame = CGRectMake(40, 140, 240, 30);
[btnTwo setTitle:@"vc2:v1" forState:UIControlStateNormal];
[btnTwo addTarget:self 
           action:@selector(goToOne) 
 forControlEvents:UIControlEventTouchUpInside];


[btnTwo setImage:[UIImage imageNamed:@"name.png"] forState:UIControlStateNormal];

//OR setting as background image

[btnTwo setBackgroundImage:[UIImage imageNamed:@"name.png"] 
                  forState:UIControlStateNormal];

[self.view addSubview:btnTwo];
Ajay Sharma
źródło
Ta część kodu mnie zdezorientowała. <code> btnImage = [UIImage imageNamed: @ "image.png"]; </code> Co to jest btnImage? Nie było tego w oryginalnym kodzie. Czy to nowy przycisk?
Mike Martin
możesz bezpośrednio ustawić obraz przycisku zamiast brać inny obiekt obrazu, taki jak ten: [btnTwo setImage: [UIImage imageNamed: @ "image.png"]];
Ajay Sharma
musisz mieć buttonWithType: UIButtonTypeRoundedRect to UIButtonType Niestandardowy inny mądry przycisk nie będzie wyświetlany tak jak obraz.
Praveen-K
2

Szukałem rozwiązania, które można dodać UIImagedo mojego UIButton. Problem polegał na tym, że wyświetla obraz większy niż potrzebny. Właśnie mi pomógł z tym:

_imageViewBackground = [[UIImageView alloc] initWithFrame:rectImageView];
_imageViewBackground.image = [UIImage imageNamed:@"gradientBackgroundPlain"];
[self addSubview:_imageViewBackground];
[self insertSubview:_imageViewBackground belowSubview:self.label];
_imageViewBackground.hidden = YES;

Za każdym razem, gdy chcę wyświetlać moje UIImageView, po prostu ustawiam var hiddenna YESlub NO. Mogą istnieć inne rozwiązania, ale tyle razy pomyliłem się z tymi rzeczami i to rozwiązało i nie musiałem zajmować się wewnętrznymi sprawami UIButtonw tle.

Alex Cio
źródło
2

Nie przejmuj się tak bardzo kadrowaniem przycisku z kodu, możesz to zrobić w serii ujęć. To działało dla mnie, jedna linia ... prościej.

[self.button setBackgroundImage:[UIImage imageNamed: @"yourPic.png"] forState:UIControlStateNormal];
Peter Schultz
źródło
2
-(void)buttonTouched:(id)sender
{
    UIButton *btn = (UIButton *)sender;

    if( [[btn imageForState:UIControlStateNormal] isEqual:[UIImage imageNamed:@"icon-Locked.png"]])
    {
        [btn setImage:[UIImage imageNamed:@"icon-Unlocked.png"] forState:UIControlStateNormal];
        // other statements....
    }
    else
    {
        [btn setImage:[UIImage imageNamed:@"icon-Locked.png"] forState:UIControlStateNormal];
        // other statements....
    }
}
Leemboy
źródło
2

Wersja Swift 3 (butt_img musi być zestawem obrazów w folderze Assets.xcassets lub Images.xcassets w Xcode):

btnTwo.setBackgroundImage(UIImage(named: "butt_img"), for: .normal)
btnTwo.setTitle("My title", for: .normal)

W każdym razie, jeśli chcesz przeskalować obraz, aby wypełnić rozmiar przycisku, możesz dodać UIImageViewnad nim i przypisać mu swój obraz:

let img = UIImageView()
img.frame = btnTwo.frame
img.contentMode = .scaleAspectFill
img.clipsToBounds = true
img.image = UIImage(named: "butt_img")
btnTwo.addSubview(img)
Frank Eno
źródło