Переупорядочение подпрограмм UIView
В моем приложении я пытаюсь подключить subview к фронту, а затем верну его обратно к исходной позиции слоя позже. Код должен быть довольно простым:
Чтобы переместить subview на передний план (внутри моего пользовательского класса UIView):
[self.superview bringSubviewToFront:self];
Легко. Я сохраняю исходную позицию z в переменной экземпляра, которую вы предположили, zPosition
. Итак, строка до -bringSubviewToFront:
:
zPosition = [self.superview.subviews indexOfObject:self];
Итак, весь код, который я использую для вывода моего подпрограммы на передний план, это:
zPosition = [self.superview.subviews indexOfObject:self];
[self.superview bringSubviewToFront:self];
Это работает так, как должно. Проблема в том, что я пытаюсь вернуть subview туда, где он был. Я просто делаю это:
[self.superview exchangeSubviewAtIndex:zPosition withSubviewAtIndex:
[self.superview.subviews indexOfObject:self]];
Используя этот код, если у меня есть два подзаголовка, вот что происходит:
Скажем, у меня есть вид A и вид B. Вид A выше вида B. Я смотрю на B, он выходит на передний план. Я снова нажимаю вид B (он должен вернуться туда, где он был), и ничего не происходит, поэтому теперь он отображается на A. Если я сейчас коснусь вида A, он выходит на передний план, но когда я снова нажимаю его (поэтому он должен вернитесь в исходное положение z: ниже вида B), все его взгляды сестры исчезают!
Кто-нибудь видит, что может вызвать эту проблему?
Ответы
Ответ 1
exchangeSubviewAtIndex вполне может вернуть представление в нужное место, но он также заменит другой вид сверху, который не будет тем, с чего вы начали. Возможно, вам понадобится сделать что-то вроде этого вместо exchangeSubviewAtIndex:
[self retain];
UIView *superview = self.superview;
[self removeFromSuperview];
[superview insertSubview:self atIndex:zPosition];
[self release];
Ответ 2
Нет необходимости удалять из супервизора:
[self.superview insertSubview:self atIndex:zPosition];
Ответ 3
Этот вопрос и ответы были очень полезны для меня.
У меня было требование разместить наложение между видовой заставкой, представления которых находятся выше и ниже наложения, и я хотел сохранить динамику.
То есть, представление может сказать, что оно скрыто или нет.
Я использовал следующий алгоритм для упорядочения представлений.
Благодаря AW101 ниже для "Нет необходимости удалять вид".
Вот мой алгоритм:
- (void) insertOverlay {
// Remember above- and belowcounter
int belowpos = 0, abovepos = 0;
// Controller mainview
UIView *mainview = [self currentMainView];
// Iterate all direct mainview subviews
for (UIView* view in mainview.subviews) {
if ([self isAboveOverlay:view]) {
// Re-insert as aboveview
[mainview insertSubview:view atIndex:belowpos + (abovepos++)];
}
else {
// Re-insert as belowview
[mainview insertSubview:view atIndex:belowpos++];
}
}
// Put overlay in between above and below.
[mainview insertSubview:_overlay atIndex:belowpos];
}