6

我想根据它们的 frame.origin.y 对 UIViews 的 NSMutableArray 进行排序,我希望以 y 为第一的最低视图等。这可能是 2 个 UIViews 具有相同来源的情况。有没有现成的方法呢?

4

4 回答 4

16

NSMutableArray有几种排序方法。选择其中一个,实现排序选择器、块或函数并比较y值。下面是一个使用块的例子:

NSComparator comparatorBlock = ^(UIView *obj1, UIView *obj2) {
    if (obj1.frame.origin.y > obj2.frame.origin.y) {
        return (NSComparisonResult)NSOrderedDescending;
    }

    if (obj1.frame.origin.y < obj2.frame.origin.y) {
        return (NSComparisonResult)NSOrderedAscending;
    }
    return (NSComparisonResult)NSOrderedSame;
};

[array sortUsingComparator:comparatorBlock];
于 2012-12-14T16:58:06.637 回答
6

虽然这不是 frame.origin.y,但您也可以通过使用 SortDescriptor 并将 layer.position.y 作为键来执行此操作。

[array sortedArrayUsingDescriptors:@[[[NSSortDescriptor alloc] initWithKey:@"layer.position.y" ascending:YES]]];
于 2014-06-07T06:16:24.943 回答
1

这就是你在 Swift 中的做法:

listOfViews.sortInPlace { CGRectGetMinY($0.frame) < CGRectGetMinY($1.frame) }

就是这样 :-) 我对 Swift 的爱 :-)

于 2016-03-08T10:27:53.393 回答
-2

您可以使用获取子视图数组

yourView.subviews

然后您可以遍历每个并检查每个 frame.origin.y 并进行编码

于 2012-12-14T16:52:40.577 回答