Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 像麻省理工学院的抓取拼图块_Ios_Swift_User Interface_Interface - Fatal编程技术网

Ios 像麻省理工学院的抓取拼图块

Ios 像麻省理工学院的抓取拼图块,ios,swift,user-interface,interface,Ios,Swift,User Interface,Interface,我正在尝试创建一种拼图界面,块可以很容易地拼合在一起。接口类似于这样的东西,如果需要容纳更多的块,那么一个块需要能够扩展。我想知道做这件事的好方法是什么,或者类似的东西是否已经存在 到目前为止,关于如何实现这一点,我的想法是使块成为用户可以拖动的视图。如果它们靠得很近,我会让它们咬合在一起。至于扩展部分,这有点棘手,我可以让那些块由3个视图组成。当需要更多的空间时,我可以扩大中间部分和间隙,并适合块体。无论如何,这似乎是非常乏味的实施,老实说,似乎没有那么有效。有没有一个现有的对象/开源库可以让

我正在尝试创建一种拼图界面,块可以很容易地拼合在一起。接口类似于这样的东西,如果需要容纳更多的块,那么一个块需要能够扩展。我想知道做这件事的好方法是什么,或者类似的东西是否已经存在


到目前为止,关于如何实现这一点,我的想法是使块成为用户可以拖动的视图。如果它们靠得很近,我会让它们咬合在一起。至于扩展部分,这有点棘手,我可以让那些块由3个视图组成。当需要更多的空间时,我可以扩大中间部分和间隙,并适合块体。无论如何,这似乎是非常乏味的实施,老实说,似乎没有那么有效。有没有一个现有的对象/开源库可以让这变得更容易?

我不知道有哪个库可以神奇地为你做到这一点,但我要做的是有一个开放连接列表,其中可以容纳一个块或一块,当你松开鼠标按钮时,您选择的工件将移动到最近的位置(使用毕达哥拉斯定理计算距离)。也许你有一个门槛距离,在这个距离上,块并没有真正卡入到位。是的,扩展会稍微困难一些,但最终您可以使用一个CGPath,在函数中放置某些内容时,该CGPath会被重新绘制

这里有一个例子

extension CGPoint {
    func distanceTo(_ other:CGPoint) -> CGFloat {
        return CGFloat(sqrt((pow(other.x - self.x, 2) + pow(other.y - self.y, 2))))
    }
}
这就是我粘贴到大多数程序中的距离函数

var pieces:[NSView]!//The Pieces on the board/screen
var SelectedPiece:NSView!//the piece you are holding, could also be an index.
override func mouseUp(with event: NSEvent) {
    var spaces:[CGPoint] = []
    for piece in pieces {
        spaces.append(CGPoint(x: piece.frame.origin.x, y: piece.frame.origin.y + 20))//change 20 to whatever
        spaces.append(CGPoint(x: piece.frame.origin.x, y: piece.frame.origin.y - 20))
        //if you are actually making a puzzle you might want pieces on the sides.
    }
    var ClosestDist:CGFloat?
    var ClosestIndex:Int?
    for space in spaces {
        let dist = space.distanceTo(SelectedPiece.frame.origin)
        if closestDist != nil {
            if dist < closestDist {
                ClosestDist = dist
                ClosestIndex = spaces.index(of:space)
            }
        }else {
            ClosestDist = dist
            ClosestIndex = spaces.index(of:space)
        }
    }
    if ClosestDist! < 15 {
        SelectedPiece.frame.origin = spaces[ClosestIndex]
    }
}
var片段:[NSView]//棋盘/屏幕上的棋子
var SelectedPiece:NSView//你拿着的那块也可以是索引。
重写函数鼠标(带有事件:NSEvent){
变量空间:[CGPoint]=[]
零碎的{
append(CGPoint(x:piece.frame.origin.x,y:piece.frame.origin.y+20))//将20更改为任意值
空格.append(CGPoint(x:piece.frame.origin.x,y:piece.frame.origin.y-20))
//如果你真的在做一个拼图,你可能需要在两边加上拼图。
}
var ClosestDist:CGFloat?
变量closestinex:Int?
空间中的空间{
设dist=space.distanceTo(SelectedPiece.frame.origin)
如果最接近距离!=零{
如果距离

这显然是不完整的,但我希望这有帮助

我不认为效率应该是你最关心的,因为用户与UI元素的交互不会对CPU造成负担。请发布你的代码图片或一些资料来帮助我们?你的问题不是很清楚。。。