Створіть кнопку програмно і встановіть фонове зображення


75

Коли я намагаюся створити кнопку та встановити фонове зображення в Swift:

let button   = UIButton.buttonWithType(UIButtonType.System) as UIButton
    button.frame = CGRectMake(100, 100, 100, 100)
    button.setImage(IMAGE, forState: UIControlState.Normal)
    button.addTarget(self, action: "btnTouched:", forControlEvents: UIControlEvents.TouchUpInside)

    self.view.addSubview(button)

Я завжди отримую повідомлення про помилку: " Не вдається перетворити тип виразу" Void "у тип" UIImage " ".


Чи можете ви показати код, де заявляєте IMAGE?
67cherries

2
Як ви створюєте образ? Можливо, потрібно розгорнути його ЗОБРАЖЕННЯ!
Алекс Рейнольдс,

1
IMAGEмає виглядати якUIImage(named: "name")
Даніель

Дякую, це працює! Я лише сказав: "button.setImage (" CircleTap ", forState: UIControlState.Normal)", але зараз це працює ідеально
Гарі,

Відповіді:


139

Ваш код повинен виглядати нижче

let image = UIImage(named: "name") as UIImage?
let button   = UIButton(type: UIButtonType.Custom) as UIButton
button.frame = CGRectMake(100, 100, 100, 100)
button.setImage(image, forState: .Normal)
button.addTarget(self, action: "btnTouched:", forControlEvents:.TouchUpInside)
self.view.addSubview(button)

2
Я думаю, це насправді має бути as? UIImage Ваша версія вийде з ладу, якщо imageNamed:поверне нуль.
Девід Беррі,

3
Ну, це ваша вина, якщо його нуль, але ви можете додати? але тоді вам доведеться про це також знати setImage. Я думаю, це залежить від того, наскільки оборонний ви хочете отримати, і оскільки ви контролюєте місцевий актив, не повинно бути сюрпризу з юніт-тестом або двома
Алекс Рейнольдс

1
А як щодо зображень кіл?
Користувач

Спробуйте додати? as UIImage?
Алекс Рейнольдс,

4
змініть тип кнопки на Власний, якщо ви не хочете бачити синю кнопку = UIButton.buttonWithType (UIButtonType.Custom) як
UIButton

26

Спробуйте нижче:

let image = UIImage(named: "ImageName.png") as UIImage
var button   = UIButton.buttonWithType(UIButtonType.System) as UIButton
button.frame = CGRectMake(100, 100, 100, 100)
button .setBackgroundImage(image, forState: UIControlState.Normal)
button.addTarget(self, action: "Action:", forControlEvents:UIControlEvents.TouchUpInside)
menuView.addSubview(button)

Повідомте мене, працює це чи ні?


вам слід встановити buttonWithType на UIButtonType.Custom, а не на System, поки зображення не з’явиться
sazz

9

SWIFT 3 Версія відповіді Алекса Рейнольдса

let image = UIImage(named: "name") as UIImage?
let button = UIButton(type: UIButtonType.custom) as UIButton
button.frame = CGRect(x: 100, y: 100, width: 100, height: 100)
button.setImage(image, for: .normal)
button.addTarget(self, action: Selector("btnTouched:"), for:.touchUpInside)
        self.view.addSubview(button)

8

Swift 5 версія прийнятої відповіді:

let image = UIImage(named: "image_name")
let button = UIButton(type: UIButton.ButtonType.custom)
button.frame = CGRect(x: 100, y: 100, width: 200, height: 100)
button.setImage(image, for: .normal)
button.addTarget(self, action: #selector(function), for: .touchUpInside)

//button.backgroundColor = .lightGray
self.view.addSubview(button)

де звичайно

@objc func function() {...}

За замовчуванням зображення вирівняно по центру. Ви можете змінити це, встановивши кнопку imageEdgeInsets, наприклад:

// In this case image is 40 wide and aligned to the left
button.imageEdgeInsets = UIEdgeInsets(top: 5, left: 5, bottom: 5, right: button.frame.width - 45)

6

Вам потрібно перевірити, щоб зображення не було нульовим, перш ніж призначити його кнопці.

Приклад:

let button   = UIButton.buttonWithType(UIButtonType.System) as UIButton
button.frame = CGRectMake(100, 100, 100, 100)
if let image  = UIImage(named: "imagename.png") {
    button.setImage(image, forState: .Normal)
}

button.addTarget(self, action: "btnTouched:", forControlEvents:.TouchUpInside)
self.view.addSubview(button)

Я б подумав, що хотів би, щоб програма аварійно працювала, якщо зображення немає в проекті. так навіщо перевіряти?
Джефф

Оскільки тоді додаток не вийде з ладу і може надійти з відсутнім зображенням
MacInnis

6

Створіть кнопку та додайте зображення як її швидкий фон 4

     let img = UIImage(named: "imgname")
     let myButton = UIButton(type: UIButtonType.custom)
     myButton.frame = CGRect.init(x: 10, y: 10, width: 100, height: 45)
     myButton.setImage(img, for: .normal)
     myButton.addTarget(self, action: #selector(self.buttonClicked(_:)), for: UIControlEvents.touchUpInside)
     self.view.addSubview(myButton)

Виправлення: рядок 4] button.setImage (зображення, для: .normal)
MacInnis

4
let btnRight=UIButton.buttonWithType(UIButtonType.Custom) as UIButton
btnRight.frame=CGRectMake(0, 0, 35, 35)
btnRight.setBackgroundImage(UIImage(named: "menu.png"), forState: UIControlState.Normal)
btnRight.setTitle("Right", forState: UIControlState.Normal)
btnRight.tintColor=UIColor.blackColor()

4

Ось як можна створити гарну кнопку з рамкою та закругленими краями:

loginButton = UIButton(frame: CGRectMake(self.view.bounds.origin.x + (self.view.bounds.width * 0.325), self.view.bounds.origin.y + (self.view.bounds.height * 0.8), self.view.bounds.origin.x + (self.view.bounds.width * 0.35), self.view.bounds.origin.y + (self.view.bounds.height * 0.05)))
loginButton.layer.cornerRadius = 18.0
loginButton.layer.borderWidth = 2.0
loginButton.backgroundColor = UIColor.whiteColor()
loginButton.layer.borderColor = UIColor.whiteColor().CGColor
loginButton.setTitle("Login", forState: UIControlState.Normal)
loginButton.setTitleColor(UIColor(red: 24.0/100, green: 116.0/255, blue: 205.0/205, alpha: 1.0), forState: UIControlState.Normal)

3

Щоб встановити фон, ми більше не можемо використовувати forState, тому ми повинні використовувати, forщоб встановити UIControlState:

let zoomInImage = UIImage(named: "Icon - plus") as UIImage?
let zoomInButton = UIButton(frame: CGRect(x: 10), y: 10, width: 45, height: 45))
zoomInButton.setBackgroundImage(zoomInImage, for: UIControlState.normal)
zoomInButton.addTarget(self, action: #selector(self.mapZoomInAction), for: .touchUpInside)
self.view.addSubview(zoomInButton)

Я використовую цей код, щоб розмістити кнопку масштабування на карті Google. використовуйте наведений вище код для встановленого фонового зображення. Це не так, як раніше.
Шазу

Чим же він відрізняється від інших відповідей?
Leopold Joy

Щоб встановити фон зараз, ми не можемо використовувати forState, тепер ми повинні використовувати "for", щоб встановити UIControlState
Shazoo

2

Оновіть до Swift 3

let image = UIImage(named: "name")
let button = UIButton(type: .custom)
button.frame = CGRect(x: 100, y: 100, width: 100, height: 100)
button.setImage(image, for: .normal)
button.addTarget(self, action: #selector(self.btnAbsRetClicked(_:)), for:.touchUpInside)
self.view.addSubview(button)

1

Свіфт: Кнопка інтерфейсу створює програмно

let myButton = UIButton()

myButton.titleLabel!.frame = CGRectMake(15, 54, 300, 500)

myButton.titleLabel!.text = "Button Label"

myButton.titleLabel!.textColor = UIColor.redColor()

myButton.titleLabel!.textAlignment = .Center

myButton.addTarget(self,action:"Action:",forControlEvents:UIControlEvent.TouchUpInside)

self.view.addSubview(myButton)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.