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.

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)

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];

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 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) 

9

Możesz to zrobić w ten sposób

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

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];

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];

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.


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];

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....
    }
}

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)
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.