自动布局中心UIView位于其中心的另一个UIView上方

时间:2015-11-15 13:25:54

标签: swift uiview autolayout

我有一个UIViewpopup)和多个UIButton s(sender)。如果我触摸sender,我想将popup置于sender坐标的中心位置。

但是,从自动布局开始,popup始终会在刷新时移回初始位置。我知道我必须使用约束并以编程方式更改它们。

不幸的是我不知道如何在约束下调整代码。特别是popupsender更大。

有人可以就如何在启用了自动布局的情况下将UIView中心移到发件人中心提供一些建议吗?谢谢!

以下是显示问题的以下代码的屏幕图像:

screen image

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
    }
}

2 个答案:

答案 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中创建的centerXcenterY约束标记为占位符,以便在构建时删除它们,而不会干扰代码中创建的约束。

setting placeholder constraint

如果您希望将视图设置为动画,请替换:

self.view.layoutIfNeeded()

使用:

UIView.animateWithDuration(1) {
    self.view.layoutIfNeeded()
}