首页 > 解决方案 > iOS 无法更改 UITableViewCell 中标签的 X 位置

问题描述

在左侧的标签下方和右侧的开关以编程方式出现在 TableViewCell 中。我可以使用以下方法控制开关的 X 位置:

switchControl.rightAnchor.constraint(equalTo: rightAnchor, constant: -20).isActive = true

但是左侧标签的可比较指令什么也不做,它始终保持在默认的左手位置。

 labelControl.leftAnchor.constraint(equalTo: leftAnchor, constant: 100).isActive = true

我是否必须声明标签的宽度,而使用开关它是已知的?

    lazy var labelControl: UILabel = {
        let labelControl = UILabel()
        labelControl.translatesAutoresizingMaskIntoConstraints = false
        return labelControl
    }()
    
    lazy var switchControl: UISwitch = {
        let switchControl = UISwitch()
        switchControl.isOn = true
        switchControl.onTintColor = UIColor.orange
        switchControl.translatesAutoresizingMaskIntoConstraints = false
        switchControl.addTarget(self, action: #selector(handleSwitchAction), for: .valueChanged)
        return switchControl
    }()
    
    
    // MARK: - Init
    
    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        addSubview(labelControl)
        labelControl.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true
        labelControl.leftAnchor.constraint(equalTo: leftAnchor, constant: 100).isActive = true
        addSubview(switchControl)
        switchControl.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true
        switchControl.rightAnchor.constraint(equalTo: rightAnchor, constant: -20).isActive = true
    }

标签: iosuitableviewtableview

解决方案


您的代码正在尝试添加多个相同的锚约束。据推测,您会在调试控制台中收到一个自动布局警告来解释这一点。

您需要创建一个可以修改的约束:

lazy var labelControl: UILabel = {
    let labelControl = UILabel()
    labelControl.translatesAutoresizingMaskIntoConstraints = false
    return labelControl
}()

lazy var switchControl: UISwitch = {
    let switchControl = UISwitch()
    switchControl.isOn = true
    switchControl.onTintColor = UIColor.orange
    switchControl.translatesAutoresizingMaskIntoConstraints = false
    switchControl.addTarget(self, action: #selector(handleSwitchAction), for: .valueChanged)
    return switchControl
}()

// add these vars
var labelControlLeftAnchor: NSLayoutConstraint!
var switchControlRightAnchor: NSLayoutConstraint!

// MARK: - Init

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)
    addSubview(labelControl)
    labelControl.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true
    //labelControl.leftAnchor.constraint(equalTo: leftAnchor, constant: 100).isActive = true

    // create labelControlLeftAnchor
    labelControlLeftAnchor = labelControl.leftAnchor.constraint(equalTo: leftAnchor, constant: 100)
    labelControlLeftAnchor.isActive = true
    
    addSubview(switchControl)
    switchControl.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true
    //switchControl.rightAnchor.constraint(equalTo: rightAnchor, constant: -20).isActive = true

    // create switchControlRightAnchor
    switchControlRightAnchor = switchControl.rightAnchor.constraint(equalTo: rightAnchor, constant: -20)
    switchControlRightAnchor.isActive = true
    
}

现在,您可以更改.constant值以“移动”对象:

// for example
labelControlLeftAnchor.constant = 40
switchControlRightAnchor.constant = -40

推荐阅读