Переупорядочение подпрограмм 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];
}