Установка изображения для UIButton в коде

197

Как вы устанавливаете изображение для UIButton в коде?

У меня есть это:

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

но не вижу, что будет устанавливать изображение для него.

Spanky
источник

Ответы:

400

Objective-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
Как примечание: это покажет изображение, но текст заголовка кнопки будет скрыт.
Левиафан
Это код полностью работает, но я получаю изображение с разбором, так как я могу сделать это, как этот код работает для меня в случае UIImage: - largePick.image = aNewsInfo.smallImageData; Как я могу сделать это с UIButton ... Можете ли вы помочь мне ...
user755278
1
@slcott, где в документации это указано ? Я не вижу, чтобы это подсказывало нигде, что setImageне рекомендуется. (Мне кажется , вы путаете UIButton.setImageс UITableViewCell.image, которая является собственностью осуждается , как вы заявили.)
Кирк Волл
12
Внимание: если вы используете что-то еще, кроме UIButtonTypeCustom, изображение будет синим в iOS7 и 8.
Apfelsaft
2
Для Swift 3: btnTwo.setImage (btnImage, для: UIControlState.normal)
Мика Монтойя
57

Решение Майка просто покажет изображение, но любой заголовок, установленный на кнопке, не будет виден, потому что вы можете установить заголовок или изображение.

Если вы хотите установить оба (ваше изображение и заголовок), используйте следующий код:

btnImage = [UIImage imageNamed:@"image.png"];
[btnTwo setBackgroundImage:btnImage forState:UIControlStateNormal];
[btnTwo setTitle:@"Title" forState:UIControlStateNormal];
левиафан
источник
2
В чем разница между setImage и setBackgroundImage ?
onmyway133
3
setBackgroundImage растянет изображение по ширине кнопки над текстом заголовка, а setImage сделает кнопку изображением, игнорирующим текст заголовка без растяжения изображения.
Эрнест
21

Прежде чем это сработало, мне пришлось явно изменить размер рамки кнопки в зависимости от размера рамки изображения.

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
источник
@jrasmusson просто хотел добавить, что 3 строки игры с рамкой также могут быть записаны в[listButton sizeToFit]
bk138
10

В случае пользователя Swift

// 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
источник
9

Вы можете сделать это так

[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

Вы можете поместить изображение любым из способов:

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];
Аджай Шарма
источник
Эта часть кода запутала меня. <code> btnImage = [UIImage imageNamed: @ "image.png"]; </ code> Что такое btnImage? Этого не было в оригинальном коде. Это новая кнопка?
Майк Мартин
Вы можете напрямую установить изображение кнопки вместо того, чтобы брать другой объект изображения, например, так: [btnTwo setImage: [UIImage imageNamed: @ "image.png"]];
Аджай Шарма
Вы должны иметь buttonWithType: UIButtonTypeRoundedRect к UIButtonTypeCustom другая мудрая кнопка не будет отображаться в соответствии с вашим изображением.
Правин-К
2

Я искал решение, чтобы добавить UIImageк моему UIButton. Проблема была просто в том, что изображение было больше, чем нужно. Просто помог мне с этим:

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

Каждый раз, когда я хочу показать свой, UIImageViewя просто устанавливаю переменную hiddenна YESили NO. Могут быть и другие решения, но я много раз путался с этим, и это решало его, и мне не нужно было разбираться с внутренними вещами UIButton, выполняемыми в фоновом режиме.

Алекс Чио
источник
2

Не беспокойтесь, создавая кнопки из кода, вы можете сделать это на раскадровке. Это сработало для меня, одна строка ... более простая.

[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....
    }
}
Leemboy
источник
2

Версия Swift 3 (butt_img должен быть Набором изображений в папке Assets.xcassets или Images.xcassets в XCode ):

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

В любом случае, если вы хотите, чтобы изображение масштабировалось до размера кнопки, вы можете добавить UIImageViewповерх него и присвоить ему свое изображение:

let img = UIImageView()
img.frame = btnTwo.frame
img.contentMode = .scaleAspectFill
img.clipsToBounds = true
img.image = UIImage(named: "butt_img")
btnTwo.addSubview(img)
Фрэнк Ино
источник