像MIT Scratch这样的拼图拼图

时间:2016-11-03 03:31:08

标签: ios swift user-interface interface

我正在尝试创建一种拼图界面,其中块可以轻松拼接在一起。接口类似于enter image description here之类的接口,因为如果需要更多的块需要,块需要能够扩展。我想知道这样做的好方法是什么,或者类似的东西已经存在?

到目前为止,关于如何实现这一点的想法是使用户可以拖动UIViews的块。如果它们彼此接近,我会让它们齐聚一堂。至于扩展部分,这有点棘手,我可以让这些块由3个视图组成。当需要更多空间时,我可以扩展中间部分和间隙并适合块。无论如何,这似乎是非常繁琐的实施,老实说似乎没有那么高效。是否没有现成的对象/开源库我可以捎带以使这更容易?

1 个答案:

答案 0 :(得分:0)

我不知道有任何库可以为你神奇地做到这一点,但我要做的是有一个打开的连接列表,块或块可以适合,当你释放鼠标按钮,你有一块选择到最近的位置(使用毕达哥拉斯定理找到距离)。也许你有一个阈值距离,在这个距离处,块实际上不会卡入到位。是的,扩展会稍微困难一点,但最后你可以使用在函数中放置某些内容时重新绘制的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]
    }
}

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