Swift约束会破坏框架宽度和高度

时间:2017-10-26 18:50:09

标签: ios swift

我试图定义一个位于屏幕底部稍上方的圆形按钮:

let button = UIButton(type: .custom)
let diameter: Double = 64

button.translatesAutoresizingMaskIntoConstraints = false

button.setTitle("Upvote", for: [])
button.frame = CGRect(x: 100, y: 100, width: diameter, height: diameter)
button.backgroundColor = UIColor(red:0.93, green:0, blue:0.55, alpha:1)
button.layer.cornerRadius = CGFloat(diameter / 2)

view.addConstraints([
  createConstraint(button, .centerX, .equal, view, .centerX),
  createConstraint(button, .bottom, .equal, view, .bottom, multiplier: 1, constant: -100),
])

button.addTarget(self, action: #selector(handleUpvoteButtonTap), for: .touchUpInside)

view.addSubview(button)

createConstraint只是NSLayoutConstraint

的速记包装器
func createConstraint(_ item: Any, _ attribute: NSLayoutAttribute, _ relation: NSLayoutRelation, _ toItem: Any, _ toAttribute: NSLayoutAttribute, multiplier: Double = 1, constant: Double = 0) -> NSLayoutConstraint {
  return NSLayoutConstraint(
    item: item,
    attribute: attribute,
    relatedBy: relation,
    toItem: toItem,
    attribute: toAttribute,
    multiplier: CGFloat(multiplier),
    constant: CGFloat(constant)
  )
}

我遇到的问题是按钮没有使用宽度/高度diameter进行渲染(它似乎试图匹配其标题文字的尺寸)。如果我删除了addConstraints电话,则按钮看起来很正常。

1 个答案:

答案 0 :(得分:4)

您只设置了定位约束,因此大小将由按钮的intrinsicContentSize决定,按钮的标题将根据您的情况确定。button.widthAnchor.constraint(equalToConstant: diameter).isActive = true button.heightAnchor.constraint(equalToConstant: diameter).isActive = true 。如果您希望它具有特定大小,请设置大小限制。例如:

translatesAutoresizingMaskIntoConstraints = false

一旦设置{{1}},所有基于帧的定位和大小调整都将被忽略。