我正在尝试创建一种拼图界面,其中块可以轻松拼接在一起。接口类似于之类的接口,因为如果需要更多的块需要,块需要能够扩展。我想知道这样做的好方法是什么,或者类似的东西已经存在?
到目前为止,关于如何实现这一点的想法是使用户可以拖动UIViews的块。如果它们彼此接近,我会让它们齐聚一堂。至于扩展部分,这有点棘手,我可以让这些块由3个视图组成。当需要更多空间时,我可以扩展中间部分和间隙并适合块。无论如何,这似乎是非常繁琐的实施,老实说似乎没有那么高效。是否没有现成的对象/开源库我可以捎带以使这更容易?
答案 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]
}
}
这显然是不完整的,但我希望这有帮助!