Переупорядочение коллекции UIView на основе их CGPoint - PullRequest
2 голосов
/ 05 апреля 2010

У меня есть NSMutableArray, который содержит коллекцию UIViewControllers

Среди других свойств и методов экземпляр каждого из viewControllers размещается в родительском представлении

Пользователь будет размещать эти объекты индивидуально при желании.

По сути, я использую - (void) addSubview: (UIView *) представление, когда новое представление добавляется в родительский контроллер представления.

Поскольку пользовательский интерфейс изометричен, он немного усложнил ситуацию

То, что я пытаюсь сделать, - это переупорядочить представления на основе их координатной позиции, поэтому элементы, расположенные выше родительского кадра UIView, индексируются ниже, чем представления ниже в родительском кадре UIview. А элементы, расположенные слева от вида, располагаются с более высоким индексом, чем элементы справа

Я думаю, что решение, возможно, связано с переупорядочением NSMutableArray, но как я могу сравнить CGpoints? Нужно ли сравнивать x и y отдельно?

Ответы [ 3 ]

0 голосов
/ 10 апреля 2010

Это может быть упрощенный ответ, но, возможно, это то, что вы ищете.

Если у вас есть доступ к их CG-точкам, вы можете написать ...

- (NSComparisonResult) сравнить: (NSObject *) входящий;

метод в каждом делегате, который посмотрел на CGpoints входящего и «себя» и возвратил NSComparisonResult. Круто, что вы могли бы просто бежать ...

[myMutableArray sortUsingSelector: @selector (сравнить:)];

в любое время что-нибудь изменилось. Вам просто нужно настроить метод compare: для возврата правильного NSComparisonResult.

0 голосов
/ 16 апреля 2010

Мне удалось решить эту проблему, я читал кодирование значения ключа

Я создал свойство под названием itemY для хранения значения view.frame.origin.y.

Я создал метод для переназначения itemY с текущим значением view.frame.origin.y.

Теперь ViewController, который хранит массив ViewControllers, использует экземпляр NSSortDescriptor со свойством itemY.

Новый NSArray создается с использованием NSSortDescriptor

Теперь я перебираю новый NSArray и выполняю свою логику

0 голосов
/ 05 апреля 2010

То есть пользователи могут перетаскивать представления внутри родительского представления? И когда представление меняет положение, вы хотите изменить его индекс места среди подпредставлений, чтобы порядок отрисовки был правильным?

Вы можете использовать -(void)exchangeSubviewAtIndex:(NSInteger)index1 withSubviewAtIndex:(NSInteger)index2 сделать это. Недостаточно просто изменить их порядок в массиве, поскольку родительский UIView имеет собственный массив для отслеживания представлений. Вам следует создать метод переупорядочения, в котором вы переключаете представления как в своем собственном массиве, так и в родительском представлении.

Существуют функции для проверки равенства точек, включения точек в каналы, пересечения канавок и т. Д., Но здесь просто звучит так, как будто вы хотите получить точку origin.y и использовать ее для сравнения дальнейших видов "назад "или вперед ...

Кроме того, вы можете посмотреть на использование CALayers, которые также поддерживают установку позиции z.

...