微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法更改 tableview 单元格内开关的边框颜色

如何解决无法更改 tableview 单元格内开关的边框颜色

我在以编程方式创建的表内有一个开关。我无法将开关的关闭边框颜色更改为灰色。我试过色调颜色也不起作用。

如何解决

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 层是矩形的,所以它看起来像这样:

enter image description here

这可能不是您想要的。因此,要使边框遵循切换器的形状,您需要修改其角半径:

switchView.layer.borderColor = UIColor.gray.cgColor
switchView.layer.borderWidth = 1.0
switchView.layer.cornerRadius = 16.0

使它看起来像这样:

enter image description here


更新

如果您只想为切换器关闭状态应用边框,那会有点棘手,因为您需要处理切换器状态的变化。我能想到的最简单的方法是继承 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
    }

看起来很正常。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。