我刚刚开始探索Uber iOS Sdk。我正在检查RequestButton,并注意到它没有占用我们正在传递的任何帧。是否可以将按钮放在视图的所需位置?
let button = RequestButton(colorStyle:.White)
view.addSubview(button)
button.frame = CGRectMake(100,300, button.frame.size.width, button.frame.size.height)
答案 0 :(得分:0)
可以在所需位置添加RequestButton。 RequestButton使用自动布局(或基于约束的布局)而不是基于帧的布局。请参阅Apple在Auto Layout Versus Frame-Based Layout上的说明。
自动布局可确保在框架更改方向和不同设备尺寸时调整大小。在自动布局中,您需要将基于其相对位置的UIView放置到其他视图中。
以下是如何将RequestButton(button
)置于父UIView(inView
)
func centerButton(forButton button: RequestButton, inView: UIView) {
button.translatesAutoresizingMaskIntoConstraints = false
// position constraints
let horizontalConstraint = NSLayoutConstraint(item: button, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: inView, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant: 0)
let verticalConstraint = NSLayoutConstraint(item: button, attribute: NSLayoutAttribute.CenterY, relatedBy: NSLayoutRelation.Equal, toItem: inView, attribute: NSLayoutAttribute.CenterY, multiplier: 1, constant: 0)
// add constraints to view
inView.addConstraints([horizontalConstraint, verticalConstraint])
}
答案 1 :(得分:0)
可能有一种更简单的方法,但我找到了使用基于框架的布局来定位Uber RequestButton的解决方案。
将请求按钮放在包装器UIView中。通过Christine Kim的答案在包装器视图上设置约束。然后你可以定位包装器的框架,RequestButton将随之移动
// MyView.swift
let uber = RequestButton()
let uberWrapper = UIView()
uberWrapper.addSubview(uber)
self.addSubview(uberWrapper)
//Set constraints
let horizontalConstraint = NSLayoutConstraint(item: uber, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: uberWrapper, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant: 0)
let verticalConstraint = NSLayoutConstraint(item: uber, attribute: NSLayoutAttribute.CenterY, relatedBy: NSLayoutRelation.Equal, toItem: uberWrapper, attribute: NSLayoutAttribute.CenterY, multiplier: 1, constant: 0)
// add constraints to view
uberWrapper.addConstraints([horizontalConstraint, verticalConstraint])
//layoutSubviews()
//set your origin
uberWrapper.frame = CGRect(origin: CGPointMake(0, 0), size: uber.intrinsicContentSize())