Ios 基于位置按z顺序对UIView子视图排序

Ios 基于位置按z顺序对UIView子视图排序,ios,objective-c,sorting,uiview,Ios,Objective C,Sorting,Uiview,我有一个ui视图,其中包含一堆子视图。我希望根据所有子视图的y位置(frame.origin.y)对其z顺序进行排序,以便: 如果(view1.frame.origin.y>view2.frame.origin.y)-->view1的z顺序高于视图2 我可以删除所有的子视图,使用Comparator对它们进行排序,然后按照正确的顺序重新添加它们。但是,这会导致闪烁,我的目标是在不将它们从superview中删除的情况下对它们进行排序。我猜这可以通过使用排序算法加上ExchangeSubviewa

我有一个
ui视图
,其中包含一堆子视图。我希望根据所有子视图的y位置(frame.origin.y)对其z顺序进行排序,以便:

如果(view1.frame.origin.y>view2.frame.origin.y)-->view1的z顺序高于视图2


我可以删除所有的子视图,使用Comparator对它们进行排序,然后按照正确的顺序重新添加它们。但是,这会导致闪烁,我的目标是在不将它们从superview中删除的情况下对它们进行排序。我猜这可以通过使用排序算法加上
ExchangeSubviewatinex
来实现,但是我一直在努力实现这一点。

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

在这里,我们将把视图y坐标添加到字典中,并将键作为views标记。假设这些是您仅有的带有标记的子视图。否则,系统将忽略标记

// 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];

    }
}

我使用的解决方案是:

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];
}

我没有使用这个精确的解决方案,但是循环排序数组并将子视图放到前面的概念为我解决了这个问题。标记正确。谢谢
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];
}