在通过手势将视图移动到新位置后对网格中的视图进行排序

时间:2013-09-17 05:19:52

标签: ios objective-c sorting nsmutablearray grid-layout

这有点像脑筋急转弯,但我认为有一种非常简单有效的方法可以做到这一点。

在我的应用程序中,我有一个网格中的视图。可以通过手势将视图移动到任何位置。问题是使视图在手势事件之后排序到正确的位置。基本上我这样做。工作有点但不正确。

注意:视图的标记将始终更新为网格中视图的当前位置。

以下是我用来排序的代码,这里是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];
    }];

}

enter image description here

2 个答案:

答案 0 :(得分:1)

您可以将所有视图的原始位置存储在一个数组中(例如positionArray),然后当您移动视图“A”时,请继续检查当前视图查看“A”的位置,positionArray中存储的位置,如果视图位于任何存储位置的范围内,只需交换视图“A”的位置视图“A”范围内的视图。

希望这会对您有所帮助

答案 1 :(得分:0)

找到一个似乎工作正常的简单解决方案。我将viewsArray枚举中的代码替换为:

   if (CGRectContainsPoint(view.frame, myView.center)) {

        newIndex = view.tag;

         *stop = YES;

    }