这有点像脑筋急转弯,但我认为有一种非常简单有效的方法可以做到这一点。
在我的应用程序中,我有一个网格中的视图。可以通过手势将视图移动到任何位置。问题是使视图在手势事件之后排序到正确的位置。基本上我这样做。工作有点但不正确。
注意:视图的标记将始终更新为网格中视图的当前位置。
以下是我用来排序的代码,这里是a link to the actual project in a zip file。
-(void)sortViews:(UIView*)myView {
__block int newIndex;
// myView is the view that was moved.
[viewsArray removeObject:myView];
[viewsArray enumerateObjectsUsingBlock:^(UIView *view, NSUInteger idx, BOOL *stop){
if (myView.center.x > view.center.x) {
if (myView.center.y > view.center.y) {
newIndex = view.tag -1;
*stop = YES;
} else {
newIndex = view.tag +1;
*stop = YES;
}
} else if (myView.center.x < view.center.x) {
if (myView.center.y > view.center.y) {
newIndex = view.tag -1;
*stop = YES;
} else {
newIndex = view.tag +1;
*stop = YES;
}
}
}];
if (newIndex < 0) {
newIndex = 0;
} else if (newIndex > 5) {
newIndex = 5;
}
[viewsArray insertObject:myView atIndex:newIndex];
[UIView animateWithDuration:.4 animations:^{
[self arrangeGrid];
}];
}
答案 0 :(得分:1)
您可以将所有视图的原始位置存储在一个数组中(例如positionArray
),然后当您移动视图“A”时,请继续检查当前视图查看“A”的位置,positionArray
中存储的位置,如果视图位于任何存储位置的范围内,只需交换视图“A”的位置在视图“A”范围内的视图。
希望这会对您有所帮助
答案 1 :(得分:0)
找到一个似乎工作正常的简单解决方案。我将viewsArray枚举中的代码替换为:
if (CGRectContainsPoint(view.frame, myView.center)) {
newIndex = view.tag;
*stop = YES;
}