自定义 UIButton 背景颜色不起作用
Custom UIButton background color not working
我创建了一个自定义 UIButton 以在我的应用程序中以编程方式使用。在一个屏幕上它工作正常。另一方面,背景不显示。我查了很多类似的问题,并将代码与它在工作时使用的其他视图控制器进行了比较,没有明显的原因。为什么没有显示背景颜色?
自定义按钮Class
import Foundation
import UIKit
class PillButton: UIButton {
override init(frame: CGRect) {
super.init(frame: frame)
initializeButton()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
initializeButton()
}
private func initializeButton() {
backgroundColor = UIColor.white
setTitleColor(UIColor(named: "pink"), for: .normal)
contentEdgeInsets = UIEdgeInsets.init(top: 16, left: 48, bottom: 16, right: 48)
translatesAutoresizingMaskIntoConstraints = false
}
override func layoutSubviews() {
super.layoutSubviews()
let height = frame.height / 2
layer.cornerRadius = height
}
}
视图控制器
import Foundation
import UIKit
import MaterialComponents
class EventViewController: BaseViewController {
private static let HORIZONTAL_PADDING: CGFloat = 16
private var confirmButton: PillButton!
private var unableToAttendButton: UILabel!
private var signedUpLabel: UILabel!
private var baseScrollView: UIScrollView!
var event: Event!
private var viewModel: EventViewModel = EventViewModel()
override func viewDidLoad() {
super.viewDidLoad()
createView()
}
override func createView() {
super.createView()
createConfirmButton()
}
private func createConfirmButton() {
confirmButton = PillButton()
let descriptionBottomGuide = UILayoutGuide()
baseScrollView.addSubview(confirmButton)
baseScrollView.addLayoutGuide(descriptionBottomGuide)
descriptionBottomGuide.topAnchor.constraint(equalTo: eventDescription.bottomAnchor).isActive = true
confirmButton.centerXAnchor.constraint(equalTo: baseScrollView.centerXAnchor).isActive = true
confirmButton.topAnchor.constraint(equalTo: descriptionBottomGuide.bottomAnchor, constant: 20).isActive = true
}
}
confirmButton = PillButton()
我会研究这段代码。自定义按钮 class 中指定的初始化器,带有框架和编码器的初始化器调用 initializeButton(),但您没有实现 init() 来执行相同的操作。
我会改成confirmButton = PillButton(frame:)
您发布的代码有 LOT 的信息您没有提供,所以很难知道可能是什么继续。
也就是说,您的 PillButton
class:
有一些问题
- 你应该不在
layoutSubviews()
中调用initializeButton
- 你应该在
layoutSubviews()
更新角半径
- 不需要覆盖
setTitle
- 无需设置
layer
背景颜色,您已经设置了按钮的背景颜色,因此无需再次设置。
此外,在您发布的代码中,您没有在任何地方设置按钮标题。
尝试用这个替换您的 PillButton
class,看看您是否获得更好的结果:
class PillButton: UIButton {
override init(frame: CGRect) {
super.init(frame: frame)
initializeButton()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
initializeButton()
}
private func initializeButton() {
backgroundColor = Colors.black
setTitleColor(UIColor(named: "pink"), for: .normal)
contentEdgeInsets = UIEdgeInsets.init(top: 16, left: 48, bottom: 16, right: 48)
translatesAutoresizingMaskIntoConstraints = false
}
override func layoutSubviews() {
super.layoutSubviews()
// update corner radius here!
layer.cornerRadius = bounds.height / 2
}
}
如果不这样做,那么您需要对其余代码(您尚未在此处发布的代码)进行一些调试,以了解发生了什么。
我创建了一个自定义 UIButton 以在我的应用程序中以编程方式使用。在一个屏幕上它工作正常。另一方面,背景不显示。我查了很多类似的问题,并将代码与它在工作时使用的其他视图控制器进行了比较,没有明显的原因。为什么没有显示背景颜色?
自定义按钮Class
import Foundation
import UIKit
class PillButton: UIButton {
override init(frame: CGRect) {
super.init(frame: frame)
initializeButton()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
initializeButton()
}
private func initializeButton() {
backgroundColor = UIColor.white
setTitleColor(UIColor(named: "pink"), for: .normal)
contentEdgeInsets = UIEdgeInsets.init(top: 16, left: 48, bottom: 16, right: 48)
translatesAutoresizingMaskIntoConstraints = false
}
override func layoutSubviews() {
super.layoutSubviews()
let height = frame.height / 2
layer.cornerRadius = height
}
}
视图控制器
import Foundation
import UIKit
import MaterialComponents
class EventViewController: BaseViewController {
private static let HORIZONTAL_PADDING: CGFloat = 16
private var confirmButton: PillButton!
private var unableToAttendButton: UILabel!
private var signedUpLabel: UILabel!
private var baseScrollView: UIScrollView!
var event: Event!
private var viewModel: EventViewModel = EventViewModel()
override func viewDidLoad() {
super.viewDidLoad()
createView()
}
override func createView() {
super.createView()
createConfirmButton()
}
private func createConfirmButton() {
confirmButton = PillButton()
let descriptionBottomGuide = UILayoutGuide()
baseScrollView.addSubview(confirmButton)
baseScrollView.addLayoutGuide(descriptionBottomGuide)
descriptionBottomGuide.topAnchor.constraint(equalTo: eventDescription.bottomAnchor).isActive = true
confirmButton.centerXAnchor.constraint(equalTo: baseScrollView.centerXAnchor).isActive = true
confirmButton.topAnchor.constraint(equalTo: descriptionBottomGuide.bottomAnchor, constant: 20).isActive = true
}
}
confirmButton = PillButton()
我会研究这段代码。自定义按钮 class 中指定的初始化器,带有框架和编码器的初始化器调用 initializeButton(),但您没有实现 init() 来执行相同的操作。
我会改成confirmButton = PillButton(frame:)
您发布的代码有 LOT 的信息您没有提供,所以很难知道可能是什么继续。
也就是说,您的 PillButton
class:
- 你应该不在
layoutSubviews()
中调用 - 你应该在
layoutSubviews()
更新角半径
- 不需要覆盖
setTitle
- 无需设置
layer
背景颜色,您已经设置了按钮的背景颜色,因此无需再次设置。
initializeButton
此外,在您发布的代码中,您没有在任何地方设置按钮标题。
尝试用这个替换您的 PillButton
class,看看您是否获得更好的结果:
class PillButton: UIButton {
override init(frame: CGRect) {
super.init(frame: frame)
initializeButton()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
initializeButton()
}
private func initializeButton() {
backgroundColor = Colors.black
setTitleColor(UIColor(named: "pink"), for: .normal)
contentEdgeInsets = UIEdgeInsets.init(top: 16, left: 48, bottom: 16, right: 48)
translatesAutoresizingMaskIntoConstraints = false
}
override func layoutSubviews() {
super.layoutSubviews()
// update corner radius here!
layer.cornerRadius = bounds.height / 2
}
}
如果不这样做,那么您需要对其余代码(您尚未在此处发布的代码)进行一些调试,以了解发生了什么。