Swift 将具有可变约束的对象与视图上的中心x点对齐

Swift 将具有可变约束的对象与视图上的中心x点对齐,swift,alignment,constraints,var,uipangesturerecognizer,Swift,Alignment,Constraints,Var,Uipangesturerecognizer,我希望下面的swift代码将框与x轴的中心对齐。您可以从下面的gif中看到我的代码在做什么。当按下紫色按钮时,我希望框对齐。我不知道该怎么做,因为有些约束被声明为var,我不知道下一步该怎么做 我建议直接使用框架而不是约束。 当处理可变屏幕大小和屏幕旋转时,约束是合适的 步骤1:将可移动对象放入容器视图 步骤2:按容器视图内的坐标处理对象 步骤3:将容器添加到视图控制器的视图中,并将其与其他元素一起进行约束布局 class ViewController: UIViewController {

我希望下面的swift代码将框与x轴的中心对齐。您可以从下面的gif中看到我的代码在做什么。当按下紫色按钮时,我希望框对齐。我不知道该怎么做,因为有些约束被声明为var,我不知道下一步该怎么做


我建议直接使用框架而不是约束。 当处理可变屏幕大小和屏幕旋转时,约束是合适的

步骤1:将可移动对象放入容器视图

步骤2:按容器视图内的坐标处理对象

步骤3:将容器添加到视图控制器的视图中,并将其与其他元素一起进行约束布局

class ViewController: UIViewController {
    @IBOutlet weak var container: Container!
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        container.addPanGestures()
    }
    @IBAction func didTapLeftButton(_ sender: Any) {
        container.setLeftAlign()
    }
    
    @IBAction func didTapCenterButton(_ sender: Any) {
        container.setCenterXAlign()
    }
    
    @IBAction func didTapRightButton(_ sender: Any) {
        container.setRightAlign()
    }
    
    @IBAction func slide(_ sender: UISlider) {
        let scale = CGFloat(max(sender.value, 0.1))
        container.setWidthScale(scale)
    }
}

class Container: UIView {
    func setLeftAlign() {
        for view in self.subviews {
            view.frame.origin = CGPoint(x: 0, y: view.frame.origin.y)
        }
    }
    
    func setRightAlign() {
        for view in self.subviews {
            view.frame.origin = CGPoint(x: self.frame.width - view.frame.width, y:view.frame.origin.y)
        }
    }
    
    func setCenterXAlign() {
        for view in self.subviews {
            var center = view.center
            center.x = self.frame.width / 2
            view.center = center
        }
    }
    
    func setWidthScale(_ ratio: CGFloat) {
        for view in self.subviews {
            var frame = view.frame
            let center = view.center
            frame.size.width = self.frame.width * ratio
            view.frame = frame
            view.center = center
        }
    }
    
    func addPanGestures() {
        for v in self.subviews {
            let panGesture = UIPanGestureRecognizer(target: self, action: #selector(didPan(_:)))
            v.addGestureRecognizer(panGesture)
        }
    }
    
    private var initCenter: CGPoint!
    @objc func didPan(_ sender: UIPanGestureRecognizer) {
        let view = sender.view!
        let translation = sender.translation(in: view)
        
        switch sender.state {
        case .began:
            initCenter = view.center
        case .changed:
            view.center = CGPoint(x: initCenter.x + translation.x, y: initCenter.y + translation.y)
        case .cancelled:
            view.center = initCenter
        default:
            return
        }
        
    }
}

你能分享你的Xcode项目吗?我试着复制代码,但我遗漏了一些东西,无法通过平移手势移动对象。我只是使用带有一些元素的情节提要。没有什么特别的,请确保在添加平移手势之前加载视图。
class ViewController: UIViewController {
    @IBOutlet weak var container: Container!
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        container.addPanGestures()
    }
    @IBAction func didTapLeftButton(_ sender: Any) {
        container.setLeftAlign()
    }
    
    @IBAction func didTapCenterButton(_ sender: Any) {
        container.setCenterXAlign()
    }
    
    @IBAction func didTapRightButton(_ sender: Any) {
        container.setRightAlign()
    }
    
    @IBAction func slide(_ sender: UISlider) {
        let scale = CGFloat(max(sender.value, 0.1))
        container.setWidthScale(scale)
    }
}

class Container: UIView {
    func setLeftAlign() {
        for view in self.subviews {
            view.frame.origin = CGPoint(x: 0, y: view.frame.origin.y)
        }
    }
    
    func setRightAlign() {
        for view in self.subviews {
            view.frame.origin = CGPoint(x: self.frame.width - view.frame.width, y:view.frame.origin.y)
        }
    }
    
    func setCenterXAlign() {
        for view in self.subviews {
            var center = view.center
            center.x = self.frame.width / 2
            view.center = center
        }
    }
    
    func setWidthScale(_ ratio: CGFloat) {
        for view in self.subviews {
            var frame = view.frame
            let center = view.center
            frame.size.width = self.frame.width * ratio
            view.frame = frame
            view.center = center
        }
    }
    
    func addPanGestures() {
        for v in self.subviews {
            let panGesture = UIPanGestureRecognizer(target: self, action: #selector(didPan(_:)))
            v.addGestureRecognizer(panGesture)
        }
    }
    
    private var initCenter: CGPoint!
    @objc func didPan(_ sender: UIPanGestureRecognizer) {
        let view = sender.view!
        let translation = sender.translation(in: view)
        
        switch sender.state {
        case .began:
            initCenter = view.center
        case .changed:
            view.center = CGPoint(x: initCenter.x + translation.x, y: initCenter.y + translation.y)
        case .cancelled:
            view.center = initCenter
        default:
            return
        }
        
    }
}