为何无法将自定义UIButton设置为想要的尺寸?
问题原因
- 你开启了
translatesAutoresizingMaskIntoConstraints = false,这意味着按钮的布局完全由AutoLayout约束控制,手动设置的frame会被直接忽略。 - 当前代码里只注释了位置约束,没有添加宽度和高度约束,AutoLayout只能根据按钮的固有内容尺寸(标题文字+默认内边距)来确定大小,自然达不到你想要的2000宽度、30高度。
- 另外,约束里的
leftAnchor应该关联contentView.leftAnchor,直接用leftAnchor会相对于cell本身,容易出现布局偏差。
解决方法
修改代码,移除无效的frame设置,补充完整的位置+尺寸约束:
var confirmButton : UIButton = { let confirmButton = UIButton(type: .custom) confirmButton.backgroundColor = .red confirmButton.setTitle("確認", for: .normal) confirmButton.setTitleColor(.white, for: .normal) // 移除frame设置,AutoLayout模式下此配置无效 return confirmButton }() override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) confirmButton.translatesAutoresizingMaskIntoConstraints = false contentView.addSubview(confirmButton) NSLayoutConstraint.activate([ // 位置约束:距离contentView顶部12、左侧100 confirmButton.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 12), confirmButton.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 100), // 尺寸约束:固定宽度2000、高度30 confirmButton.widthAnchor.constraint(equalToConstant: 2000), confirmButton.heightAnchor.constraint(equalToConstant: 30), // 可选补充:添加底部约束,避免cell高度计算异常 confirmButton.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -12) ]) } // 补充required init方法,避免编译报错 required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") }
额外提示
如果2000的宽度是笔误,建议改用相对约束适配不同屏幕,比如替换宽度约束为:
confirmButton.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -20)
这样按钮会从左侧100延伸到右侧20,自动适配cell宽度。
内容的提问来源于stack exchange,提问作者yude
相关产品推荐
相关产品推荐

