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.