我有一个UIView
(popup
)和多个UIButton
s(sender
)。如果我触摸sender
,我想将popup
置于sender
坐标的中心位置。
但是,从自动布局开始,popup
始终会在刷新时移回初始位置。我知道我必须使用约束并以编程方式更改它们。
不幸的是我不知道如何在约束下调整代码。特别是popup
比sender
更大。
有人可以就如何在启用了自动布局的情况下将UIView
中心移到发件人中心提供一些建议吗?谢谢!
以下是显示问题的以下代码的屏幕图像:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var number: UIImageView!
@IBOutlet weak var popup: UIView!
@IBAction func openPopup(sender: UIButton) {
self.popup.center = sender.center
//old position: (190.5, 124.0) - new Position: (173.0, 414.0)
}
@IBAction func updateImage(sender: UIButton) {
self.number.image = UIImage(named: "img-1")
}
}
这是我到目前为止所做的,但我不知道这是否正确以及我必须使用什么类型的NSLayoutConstraint
来实现这一目标:
import UIKit
class ViewController: UIViewController {
var id = 1
@IBOutlet weak var number: UIImageView!
@IBOutlet weak var popup: UIView!
@IBOutlet weak var popupy: NSLayoutConstraint!
@IBOutlet weak var popupx: NSLayoutConstraint!
@IBAction func openPopup(sender: UIButton) {
popupx.constant = reposition(popup, position: sender.center).y
popupy.constant = reposition(popup, position: sender.center).x
}
@IBAction func updateImage(sender: UIButton) {
if id == 1 {
id = 2
}else {
id = 1
}
self.number.image = UIImage(named: "\(id)")
}
func reposition (element: UIView, position: CGPoint)->CGPoint
{
var p = CGPoint()
p.x = position.x - (element.frame.size.height / 2 )
p.y = position.y - (element.frame.size.width / 2)
return p
}
}
答案 0 :(得分:0)
不应更改self.popup.center
,而应为IBOutlet
制作layoutconstraint
,并更改该约束的constant
以放置弹出广告。
或者,您可以尝试设置translatesAutoresizingMaskIntoConstraints = true
并使用.frame =
更改位置。这应该将帧更改转换为自动布局约束。这可能会产生问题,因为您已经激活了自动布局约束,但与新版本相冲突,所以我建议使用IBOutlet进行约束解决方案。
答案 1 :(得分:0)
由于您希望将视图相对于不同视图随时间居中,因此一种方法是根据需要添加和删除约束。
以下代码创建NSLayoutConstraint
以使视图相对于另一个视图居中:
class ViewController: UIViewController {
@IBOutlet weak var boxView: UIView!
var boxCenterX: NSLayoutConstraint?
var boxCenterY: NSLayoutConstraint?
func centerBoxOnView(v: UIView) {
// Remove previous constraints on center, if any
boxCenterX?.active = false
boxCenterY?.active = false
boxCenterX = NSLayoutConstraint(item: boxView, attribute: .CenterX,
relatedBy: .Equal, toItem: v, attribute: .CenterX,
multiplier: 1, constant: 0)
boxCenterX?.active = true
boxCenterY = NSLayoutConstraint(item: boxView, attribute: .CenterY,
relatedBy: .Equal, toItem: v, attribute: .CenterY,
multiplier: 1, constant: 0)
boxCenterY?.active = true
self.view.layoutIfNeeded()
}
override func viewDidLoad() {
super.viewDidLoad()
// Start box at center of screen
centerBoxOnView(self.view)
}
@IBAction func buttonPressed(button: UIButton) {
centerBoxOnView(button)
}
}
当您为boxView
(您正在移动的视图)设置约束时,请确保您在Storyboard中创建的centerX
和centerY
约束标记为占位符,以便在构建时删除它们,而不会干扰代码中创建的约束。
如果您希望将视图设置为动画,请替换:
self.view.layoutIfNeeded()
使用:
UIView.animateWithDuration(1) {
self.view.layoutIfNeeded()
}