Ios 如何使用手势和选择该手势中的按钮

Ios 如何使用手势和选择该手势中的按钮,ios,swift,Ios,Swift,您好,我正在制作一个带有64个按钮(8x8)的应用程序,我想使用一个手势,这样当播放器点击其中一个按钮,然后滑入其他按钮时,所有按钮都被(点击) 因此,每当你滑动这些按钮时,幻灯片中的所有按钮都会被点击 有人可以选择吗?看看这是否能让你走 我们创建一个8x8的标签网格。我使用“行”-“列”编号作为每个标签的文本。您可以将其替换为您希望显示的任何文本(如字母) 然后,我们使用touchesbeated和touchesMoved来跟踪触摸运动,当用户在网格上拖动手指时,更改所触摸的每个“磁贴”的背景

您好,我正在制作一个带有64个按钮(8x8)的应用程序,我想使用一个手势,这样当播放器点击其中一个按钮,然后滑入其他按钮时,所有按钮都被(点击)

因此,每当你滑动这些按钮时,幻灯片中的所有按钮都会被点击


有人可以选择吗?

看看这是否能让你走

我们创建一个8x8的标签网格。我使用“行”-“列”编号作为每个标签的文本。您可以将其替换为您希望显示的任何文本(如字母)

然后,我们使用
touchesbeated
touchesMoved
来跟踪触摸运动,当用户在网格上拖动手指时,更改所触摸的每个“磁贴”的背景颜色:

class MultiSelectViewController: UIViewController {

    var tilesArray: [UIView] = [UIView]()

    override func viewDidLoad() {
        super.viewDidLoad()

        var x: CGFloat = 30
        var y: CGFloat = 40
        let w: CGFloat = 40

        for row in 1...8 {
            for col in 1...8 {
                let v = UILabel()
                v.backgroundColor = .blue
                v.text = "\(row)-\(col)"
                v.textAlignment = .center
                v.textColor = .white
                v.font = UIFont.systemFont(ofSize: 10, weight: .light)
                v.layer.borderColor = UIColor.yellow.cgColor
                v.layer.borderWidth = 0.5
                v.frame = CGRect(x: x, y: y, width: w, height: w)
                tilesArray.append(v)
                view.addSubview(v)
                x += w
            }
            y += w
            x = 30
        }

    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

        super.touchesBegan(touches, with: event)

        if let t = touches.first {
            let loc = t.location(in: self.view)
            for v in tilesArray {
                if v.frame.contains(loc) {
                    v.backgroundColor = .red
                    break
                }
            }
        }

    }

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {

        super.touchesMoved(touches, with: event)

        if let t = touches.first {
            let loc = t.location(in: self.view)
            for v in tilesArray {
                if v.frame.contains(loc) {
                    v.backgroundColor = .red
                    break
                }
            }
        }

    }

}
类MultiSelectViewController:UIViewController{
变量TileArray:[UIView]=[UIView]()
重写func viewDidLoad(){
super.viewDidLoad()
变量x:CGFloat=30
变量y:CGFloat=40
设w:CGFloat=40
对于第1…8行{
对于1…8中的col{
设v=UILabel()
v、 背景颜色=.blue
v、 text=“\(行)-\(列)”
v、 textAlignment=.center
v、 textColor=.white
v、 font=UIFont.systemFont(尺寸:10,重量:轻)
v、 layer.borderColor=UIColor.yellow.cgColor
v、 layer.borderWidth=0.5
v、 帧=CGRect(x:x,y:y,宽度:w,高度:w)
tilesArray.append(v)
视图。添加子视图(v)
x+=w
}
y+=w
x=30
}
}
覆盖func TouchesBegind(Touchs:Set,带有事件:UIEvent?){
super.touchesbeated(touches,with:event)
如果让t=touch.first{
设loc=t.位置(在:自视图中)
tilesArray中的v{
如果v.frame.包含(loc){
v、 背景颜色=.red
打破
}
}
}
}
覆盖功能触摸移动(touchs:Set,带有事件:UIEvent?){
super.touchesMoved(touches,with:event)
如果让t=touch.first{
设loc=t.位置(在:自视图中)
tilesArray中的v{
如果v.frame.包含(loc){
v、 背景颜色=.red
打破
}
}
}
}
}
下面是它的外观(拖动一点后):


编辑

如何将拖动限制为直线?可能有很多不同的方法,但这里有一个大致的想法

假设我们首先选择tile
3-3

我们可以将7个磁贴拖动到下一个,因此我们可以跟踪这些磁贴的位置。这可以通过数学、点数组、索引值数组、平铺对象数组等来实现

让我们制作一个数组,并将其命名为
selectableTiles

请注意,如果我们从边(或角)开始,我们将无法获得所有7个位置,因此必须考虑:

拖动时,在触摸点找到“当前”磁贴,并查看它是否在
selectableTiles
数组中。如果是,我们也选择该平铺。一旦我们选择了两个磁贴,就只能有一个可用磁贴。在这种情况下,平铺
1-1

不过,当我们第一次尝试它时,我们会发现在对角线上拖动而不穿过相邻的瓷砖几乎是不可能的。因此,我们需要保持原始
selectableTiles
可用:

如果我们继续在原始的
selectableTiles
中拖动,我们将取消选择并不断更新一个和唯一下一个可选tile:

一旦我们移动到第三个磁贴,我们就可以摆脱原来的
selectableTiles
,只需跟踪新的磁贴和下一个可选磁贴:

当我们到达边缘时,我们完成了:


你的问题不清楚。你能再解释一下吗你需要把它们做成按钮吗?或者它们可能是标签或普通视图?我已经有了按钮。我编辑了这篇文章。显示您为解决此问题而编写的代码。人们不会为你写的。@LesleyHutchinson—“我已经有按钮了”并没有回答这个问题。。。它们需要是纽扣吗?或者它们只能是正方形/矩形?但是有没有一种方法可以将其剪裁成45度,比如当你从1-1开始时,你可以直接向下、向右或斜向2-2?@LesleyHutchinson-当然有一种方法可以做到这一点。但是这就回答了你帖子中的问题:“因此,每当你滑动这些按钮时,幻灯片中的所有按钮都会被点击。”下一部分取决于你。如果你不能让它工作,那么回来问一个新问题。但是你需要先做些工作。你能帮我吗@DonMag,我找不到如何。。。我真的很专注于这个应用程序。@LesleyHutchinson-“我真的很专注于这个应用程序”。。。这是学校作业吗?或者对于您希望通过应用商店分发(销售?)的应用程序?你有没有试着找出做你想做的事情的逻辑?我试过了,已经找了好几个小时了,但仍然没有任何进展。请帮我做这个。我也不能发布关于堆栈溢出的其他问题