iOS Swift Gestures:如何将两个项目与手势联系起来

Posted

技术标签:

【中文标题】iOS Swift Gestures:如何将两个项目与手势联系起来【英文标题】:iOS Swift Gestures : How can I link two items with gestures 【发布时间】:2019-06-26 21:04:19 【问题描述】:

我的视图中有 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)

【问题讨论】:

【参考方案1】:

在每个平移手势 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)

这里是一个正在运行的游乐场

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()

【讨论】:

非常感谢。我做了以下 2 项修改:将插座中的按钮转换为不再操作,并在 CGPoint 方法中添加了 x: 和 y:。

以上是关于iOS Swift Gestures:如何将两个项目与手势联系起来的主要内容,如果未能解决你的问题,请参考以下文章

无法使用白色按钮项色调使 UIToolBar 变为黑色(ios 9,Swift)

IOS Swift:如何在两个控制器之间传输数据

如何在 iOS 上使用 Swift 将 1 个以上的 RSS Feed 解析并合并为一个 Feed

将两个imageViews合并为一个并保存iOS swift

iOS 14,Swift UI 2 更改 NavigationLink 内选定列表项的背景颜色

如何在 iOS Swift 中将选定的 tableView 单元格保存到数组中?