根据位置

时间:2015-11-19 16:13:34

标签: ios objective-c sorting uiview

我有UIView一堆子视图。我想根据y位置(frame.origin.y)对所有子视图的z顺序进行排序,这样:

if(view1.frame.origin.y> view2.frame.origin.y) - > view1具有比视图2更高的z顺序。

我可以删除所有子视图,使用sortedArrayUsingComparator对它们进行排序,然后按正确的顺序重新添加它们。但是,这会导致闪烁,我的目标是对所有内容进行排序,而无需从超视图中删除它们。我猜这可以使用排序算法加exchangeSubviewAtIndex来完成,但是我坚持实现它。

2 个答案:

答案 0 :(得分:2)

我用于此的解决方案是:

NSArray *arraySorted = [self.subviews sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {

    NSComparisonResult result = NSOrderedSame;

    if ([obj1 isKindOfClass:[MySubView class]] && [obj2 isKindOfClass:[MySubView class]]) {

        MySubView *pin1 = (MySubView *)obj1;
        MySubView *pin2 = (MySubView *)obj2;

        result = pin1.frame.origin.y > pin2.frame.origin.y ? NSOrderedDescending : NSOrderedAscending;

    }

    return result;

}];

for (UIView *subview in arraySorted) {
    [self bringSubviewToFront:subview];
}

答案 1 :(得分:1)

因此,为了做到这一点,我建议在初始化时为您的视图设置标记,以便我们以后可以轻松找到它们。

这里我们将视图y坐标添加到字典中,并将密钥作为视图标记。假设这些是您唯一带有标签的子视图。否则有一个系统可以省略标签。

// Setting views and frames.

NSMutableDictionary *dict   = [[NSMutableDictionary alloc] init];
NSMutableArray *objectArray = [[NSMutableArray alloc] init];
NSMutableArray *keyArray    = [[NSMutableArray alloc] init];

for (UIView *view in self.view.subviews) {

    if (view.tag) {

        [dict setObject:[NSNumber numberWithFloat:view.frame.origin.y] forKey:[NSNumber numberWithInt:view.tag]];

    }

}

遍历字典并按降序插入y值。

for (NSNumber *keyNum in [dict allKeys]) {

    float x = [[dict objectForKey:keyNum] floatValue];

    int count = 0;

    if (floatArray.count > 0) {

        for (NSNumber *num in floatArray) {

            float y = [num floatValue];

            if (x < y) {

                count++;

                [floatArray insertObject:[NSNumber numberWithFloat:x] atIndex:count];
                [tagArray insertObject:keyNum atIndex:count];

                break;
            }

        }

    }else{

        [floatArray insertObject:[NSNumber numberWithFloat:x] atIndex:count];
        [tagArray insertObject:keyNum atIndex:count];

    }
}

使用标签返回视图,并通过迭代每个视图并使用bringSubViewToFront方法定位视图,这应该按正确的顺序堆叠它们。

注意:这假设您的视图中没有其他子视图需要在层次结构之上,如果是,我将使用insertSubview:AtIndex:method。

for (NSNumber *num in tagArray) {

    UIView *view = (UIView *)[self.view viewWithTag:[num integerValue]];

    NSLog(@"view.frame.origin.y: %.2f",view.frame.origin.y);

    [self.view bringSubviewToFront:view];

}