问题描述
我在以编程方式创建的表内有一个开关。我无法将开关的关闭边框颜色更改为灰色。我试过色调颜色也不起作用。
如何解决?
func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell",for: indexPath) as? TableViewCell else {
fatalError("...")
}
//...
let switchView = UISwitch()
switchView.layer.borderColor = UIColor.greyColour.cgColor
cell.accessoryView = switchView
return cell
}
解决方法
您没有指定要达到的效果,但要使 layer.borderColor
起作用,您还需要设置 layer.borderWidth
。但是,因为 switch 层是矩形的,所以它看起来像这样:
这可能不是您想要的。因此,要使边框遵循切换器的形状,您需要修改其角半径:
switchView.layer.borderColor = UIColor.gray.cgColor
switchView.layer.borderWidth = 1.0
switchView.layer.cornerRadius = 16.0
使它看起来像这样:
更新
如果您只想为切换器关闭状态应用边框,那会有点棘手,因为您需要处理切换器状态的变化。我能想到的最简单的方法是继承 UISwitch
并通过覆盖 sendActions
方法提供您自己的行为:
class BorderedSwitch: UISwitch {
var borderColor: UIColor = UIColor.gray {
didSet {
layer.borderColor = borderColor.cgColor
}
}
required init?(coder: NSCoder) {
super.init(coder: coder)
setup()
}
override init(frame: CGRect) {
super.init(frame: frame)
setup()
}
override var isOn: Bool {
didSet {
updateState()
}
}
override func sendActions(for controlEvents: UIControl.Event) {
super.sendActions(for: controlEvents)
if controlEvents.contains(.valueChanged) {
updateState()
}
}
private func setup() {
layer.borderColor = borderColor.cgColor
layer.cornerRadius = frame.height / 2
layer.borderWidth = 1.0
}
private func updateState() {
layer.borderWidth = isOn ? 0.0 : 1.0
}
}
请注意,我还将 cornerRadius 值更新为 frame.height / 2
以避免幻数
如果您添加带有代码的开关,它看起来就像您在故事板中添加的开关。两种创建开关的方法都没有边框颜色。
下面的代码向视图控制器的内容视图添加了一个开关:
@IBOutlet var switchView: UISwitch!
override func viewDidLoad() {
super.viewDidLoad()
switchView = UISwitch()
switchView.translatesAutoresizingMaskIntoConstraints = false //Remember to do this for UIViews you create in code
if false {
//Add a gray border to the switch
switchView.layer.borderWidth = 1.0 // Draw a rounded rect around the switchView so you can see it
switchView.layer.borderColor = UIColor.gray.cgColor
switchView.layer.cornerRadius = 16
}
//Add it to the container view
view.addSubview(switchView)
//Create center x & y layout anchors (with no offset to start)
let switchViewXAnchor = switchView.centerXAnchor.constraint(equalTo: view.centerXAnchor,constant: 0)
switchViewXAnchor.isActive = true
let switchViewYAnchor = switchView.centerYAnchor.constraint(equalTo: view.centerYAnchor,constant: 0.0)
switchViewYAnchor.isActive = true
}
看起来很正常。