iOS Swift 手势 : How can I link two items with gestures

标签 ios swift uipangesturerecognizer

我的 View 中有 2 个按钮。我创建了 2 个 UIPanGestureRecognizer,每个按钮一个。我可以单独移动它们,但我希望当我向右滑动一个按钮时,另一个按钮会向左滑动。我真的不知道该怎么做。最佳实践是什么?

@IBAction func button1(_ sender: Any) {}
@IBAction func button2(_ sender: Any) {}

@IBAction func bottomButtonGesture
    (recognizer:UIPanGestureRecognizer) {

    let translation = recognizer.translation(in: self.view)
    if let view = recognizer.view {
        view.center = CGPoint(x:view.center.x + translation.x,
                              y:view.center.y/* + translation.y*/)
    }
    recognizer.setTranslation(CGPoint.zero, in: self.view)
}

@IBAction func topButtonGesture
    (recognizer:UIPanGestureRecognizer) {

    let translation = recognizer.translation(in: self.view)
    if let view = recognizer.view {
        view.center = CGPoint(x:view.center.x - translation.x,
                              y:view.center.y/* + translation.y*/)
    }
    recognizer.setTranslation(CGPoint.zero, in: self.view)
}

最佳答案

在每个平移手势 IBAction 中,您希望将未平移的按钮设置为与正在平移的按钮具有相反的 x 位置。

@IBAction func bottomButtonGesture
    (recognizer:UIPanGestureRecognizer) {

    let translation = recognizer.translation(in: self.view)
    if let view = recognizer.view {
        view.center = CGPoint(x: view.center.x + translation.x,
                              y: view.center.y)

        // Move the other button here too
        // Notice we are subtracting the translation.x value instead of adding
        button2.center = CGPoint(x: button2.center.x - translation.x,
                              y: button2.center.y)
    }
    recognizer.setTranslation(CGPoint.zero, in: self.view)
}

@IBAction func topButtonGesture
    (recognizer:UIPanGestureRecognizer) {

    let translation = recognizer.translation(in: self.view)
    if let view = recognizer.view {
        view.center = CGPoint(x: view.center.x + translation.x,
                              y: view.center.y)

        // Move the other button here too
        // Notice we are subtracting the translation.x value instead of adding
        button1.center = CGPoint(x: button1.center.x - translation.x,
                              y: button1.center.y)
    }
    recognizer.setTranslation(CGPoint.zero, in: self.view)
}

这是一个正在运行的 Playground

import UIKit
import PlaygroundSupport

class ViewController: UIViewController {

    let button1 = UIButton(frame: CGRect(x: 160, y: 100, width: 40, height: 40))
    let button2 = UIButton(frame: CGRect(x: 160, y: 200, width: 40, height: 40))

    override func loadView() {
        super.loadView()

        // Tab Views
        button1.backgroundColor = .orange
        self.view.addSubview(button1)

        button2.backgroundColor = .blue
        self.view.addSubview(button2)

        let panGesture1 = UIPanGestureRecognizer(target: self, action: #selector(button1Pan(recognizer:)))
        button1.addGestureRecognizer(panGesture1)

        let panGesture2 = UIPanGestureRecognizer(target: self, action: #selector(button2Pan(recognizer:)))
        button2.addGestureRecognizer(panGesture2)
    }

    @objc func button1Pan(recognizer: UIPanGestureRecognizer) {
        let translation = recognizer.translation(in: self.view)
        if let view = recognizer.view {
            view.center = CGPoint(x:view.center.x + translation.x,
                                  y:view.center.y)

            // Move the other button here too
            button2.center = CGPoint(x: button2.center.x - translation.x,
                                     y: button2.center.y)
        }
        recognizer.setTranslation(CGPoint.zero, in: self.view)
    }

    @objc func button2Pan(recognizer: UIPanGestureRecognizer) {

            let translation = recognizer.translation(in: self.view)
            if let view = recognizer.view {
                view.center = CGPoint(x:view.center.x + translation.x,
                                      y:view.center.y)

                // Move the other button here too
                button1.center = CGPoint(x: button1.center.x - translation.x,
                                         y: button1.center.y)
            }
            recognizer.setTranslation(CGPoint.zero, in: self.view)
    }
}

PlaygroundPage.current.needsIndefiniteExecution = true
PlaygroundPage.current.liveView = ViewController()

关于iOS Swift 手势 : How can I link two items with gestures,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56780872/

相关文章:

ios - 为什么 UIDatePicker 填充两个不同的 TextField 相同的值

ios - UIPanGestureRecognizer 冲突

ios - 屏幕上任何位置的默认 interactivePopGestureRecognizer

iphone - iPod Touch 第二代 - 固件

ios - Objective C 为什么我需要在这种情况下进行类型转换?

ios - 如何以编程方式创建按钮?

ios - 内购收据校验, "in_app"字段为空

ios - 将 UIPanGestureRecognizer 和 UISwipeGestureRecognizer 添加到同一 View 会导致在设置 requireGestureToFail 后发生冲突

ios - 体系结构 x86_64/i386 的 undefined symbol

ios - 在 ios 中使用好友系统解析 swift