2014-01-10 4 views
1

У меня есть следующая проблема: я хочу иметь константы, определяющие порядок подпунктов в массиве parentView.subviews. Эти константы не обязательно должны быть индексами массива subview, но они могут.zPosition и subviews array

Что-то вроде этого:

#define VIEW1_INDEX 10 // or 0, if it's an index 
#define VIEW2_INDEX 20 // or 1, if it's an index 

И это будет означать, что parentView.subviews массив {view1, view2}.

Сначала я попытался использовать свойство ZPosition CALayer.

Скажем, у меня есть два подвала из parentView: view1 и view2, и они имеют одинаковые размеры и рамки. parentView.subviews массив {view1, view2} (в этом порядке). Если я

view2.layer.zPosition = VIEW2_INDEX; 
view1.layer.zPosition = VIEW1_INDEX; 

, чем порядок отображения подвиды изменений, но водопроводная обработку заказа и parentView.subviews массив остается неизменным, так что я вижу view1 в верхней части, нажмите на него, но это водопроводная обрабатывается view2, который это не то, что я ожидаю.

Так что мне нужно изменить порядок отображения и порядок обработки событий одновременно.

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

view2.layer.zPosition = 0; 
NSUInteger* index = [parentView.subviews indexOfObject:view2]; 
[parentView exchangeSubviewAtIndex:0 withSubviewAtIndex:index]; 

Но это не кажется лучшим решением.


Другая идея состояла в том, чтобы использовать [parentView insertSubview:atIndex:] вместо [parentView addSubview], но чем мне нужно будет, чтобы убедиться, что я вставив мнения в надлежащем порядке, который немного утомительно, так как у меня есть около 15 просмотров создается в различные места.

Итак, вот, наконец, вопрос: есть ли способ решить проблему, описанную в начале?

ответ

1

Как насчет назначения тегов subviews 1..15 (если их 15) в соответствии с желаемым порядком укладки. Поместите их все в массив, который вы затем сортируете по тегу. Итерируйте массив, добавив их в супервизор.

Я не знаю, как они созданы, но, скажем, они содержатся в некотором массиве в в произвольном порядке:

NSMutableArray *views = [NSMutableArray array]; 

UIView *subview9 = [[UIView alloc] init]; 
subview9.tag = 9; 
[views addObject:subview9]; 

// and so on, in arbitrary order for subview1, subview2, subview3 
// remember tag == 0 is no good, because it will be undistinguishable in viewWithTag 
// from unassigned tags 

Сортировка массива:

[views sortUsingComparator:^(UIView *vA, UIView *vB) { 
    return vA.tag - vB.tag; 
}]; 

Добавьте их в SuperView, теперь сортируется:

for (UIView *view in views) { 
    [theViewThatContainsThemInTagOrder addSubview:view]; 
} 
1

Если вы используете zPosition это будет просто переместить слой (визуальная часть), но каждый вещь будет работать, как ничто не изменилось.Попробуйте с помощью этого:

[self.view sendSubviewToBack:view1]; 

или

[self.view bringSubviewToFront:view2];