ios - 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
}
解决方案
您的代码正在尝试添加多个相同的锚约束。据推测,您会在调试控制台中收到一个自动布局警告来解释这一点。
您需要创建一个可以修改的约束:
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
推荐阅读
- performance - 如何在 Visual Studio 2017 C++ 项目中启用应用程序时间线?
- javascript - 如何遍历 Javascript 中的嵌套对象?
- postgresql - 如何在 Openshift 3 上使用端口转发数据库 Postgrsql 进行连接
- python - 根据主要颜色激活/停用像素
- c# - .NET Core 端点 + 全局 CORS
- java - 由于 HttpExchange 要求 sendResponseHeaders(int,long) 必须在 getResponseBody() 之前,我该如何处理传输文件?
- c# - oracle选择计数查询在c#中不起作用
- amazon-dynamodb - 如何将 5000 条记录写入 DynamoDB 表?
- c++ - 在编译中包含 botan 2
- xslt-1.0 - XSLT 1.0:如何从字符串中只删除一个空格?