Вы можете добиться того, чего хотите, с помощью специального класса UIButton
.
import UIKit
class CustomButton: UIButton {
override func awakeFromNib() {
super.awakeFromNib()
layer.borderWidth = 1.0
layer.borderColor = UIColor.systemGray4.cgColor
layer.cornerRadius = 5.0
contentEdgeInsets = UIEdgeInsets(top: 0.0, left: 10.0, bottom: 0.0, right: 0.0)
}
}
Это даст вам кнопку с рамкой и вставкой, которая выглядит так, как вы пытаетесь достичь:
Хороший способ проверить, нажата ли кнопка правильного ответа, - это использовать свойство tag
в UIButton
. Например, 0 за неправильный ответ, 1 за правильный ответ. Затем вы можете проверить значение тега при нажатии каждой кнопки. (все кнопки подключены к одному IBAction
). Если нажата правильная кнопка, вы можете установить зеленый цвет границы и сделать все, что вам нужно, перед повторением цикла.
import UIKit
class ViewController: UIViewController {
@IBOutlet var answerAButton: CustomButton!
@IBOutlet var answerBButton: CustomButton!
@IBOutlet var answerCButton: CustomButton!
@IBOutlet var answerDButton: CustomButton!
var answerButtons: [UIButton]!
override func viewDidLoad() {
super.viewDidLoad()
answerButtons = [answerAButton, answerBButton, answerCButton, answerDButton]
setCorrectAnswer()
}
func setCorrectAnswer() {
answerButtons.forEach {
// Reset the border on each button
$0.layer.borderColor = UIColor.systemGray4.cgColor
// Reset the tag on each button
$0.tag = 0
}
// Set the correct answer button tag
answerButtons[2].tag = 1
}
@IBAction func answerTapped(_ sender: UIButton) {
if sender.tag == 1 {
sender.layer.borderColor = UIColor.green.cgColor
}
}
}
Ответы на дополнительные вопросы:
1. Куда бы я поместил пользовательскую кнопку?
2. Какой тип файла мне следует создать для этого?
- Создайте файл Swift с именем CustomButton.swift (или как вы хотите его назвать).
- В Storyboard используйте стандартный UIButton, а в Identity Inspector измените настраиваемый класс, чтобы он соответствовал. Убедитесь, что
IBOutlets
для ваших кнопок имеет тип CustomButton
для вашего IBOutlet
соединения. Как показано выше. Вы не увидите эффекты в раскадровке, только во время выполнения.