UIKit应用中UITextField尺寸控制问题
问题原因
你给UIStackView添加了heightAnchor.constraint(equalTo: view.heightAnchor)约束,让它占满整个屏幕高度。而垂直方向的UIStackView默认distribution属性是.fill,这种模式下StackView会强制拉伸所有排列的子视图来填满自身高度,哪怕子视图设置了固定高度约束也会被覆盖。
解决方案
有两种常用解决方式,可根据你的布局需求选择:
方式一:让StackView根据内容自适应高度(推荐,更符合布局逻辑)
移除StackView的高度约束,改用顶部、左右边缘的约束来固定位置,这样StackView会根据内部元素的高度自动调整自身高度,TextField的固定高度约束就能正常生效:
修改setupUI()里的StackView约束部分:
// 替换原来的stackView高度约束 stackView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true stackView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true stackView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
方式二:保留StackView占满屏幕高度,阻止拉伸TextField
如果必须让StackView占满整个屏幕高度,可通过以下两种方式实现:
方法A:修改StackView的distribution属性
在创建StackView时添加:
stackView.distribution = .fillProportionally
这种模式下,子视图会按照自身固有尺寸的比例分配空间,你的固定高度约束会被优先尊重。
方法B:调整TextField的布局优先级
在创建TextField时添加:
textfield.setContentHuggingPriority(.required, for: .vertical) textfield.setContentCompressionResistancePriority(.required, for: .vertical)
设置后StackView会优先保证TextField的高度不被拉伸或压缩。
修改后的完整代码示例(方式一)
lazy var nameTextField: UITextField = { let textfield = UITextField() textfield.translatesAutoresizingMaskIntoConstraints = false textfield.placeholder = "Budget name" textfield.leftView = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: 0)) textfield.leftViewMode = .always textfield.borderStyle = .roundedRect return textfield }() override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = UIColor.green setupUI() } private func setupUI() { let stackView = UIStackView() stackView.alignment = .leading stackView.translatesAutoresizingMaskIntoConstraints = false stackView.axis = .vertical stackView.spacing = UIStackView.spacingUseSystem stackView.isLayoutMarginsRelativeArrangement = true stackView.directionalLayoutMargins = NSDirectionalEdgeInsets(top: 20, leading: 20, bottom: 20, trailing: 20) view.addSubview(stackView) stackView.addArrangedSubview(nameTextField) // TextField约束 nameTextField.widthAnchor.constraint(equalToConstant: 200).isActive = true nameTextField.heightAnchor.constraint(equalToConstant: 60).isActive = true // StackView约束(自适应高度,顶部对齐) stackView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true stackView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true stackView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true }
内容的提问来源于stack exchange,提问作者john doe
相关产品推荐
相关产品推荐

