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造成负担。请发布你的代码图片或一些资料来帮助我们?你的问题不是很清楚。。。