UIView insertSubview atIndex для перемещения нечетного поведения подпредставления - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть UIView, который в этом случае имеет 4 подпредставления.Я хочу иметь возможность изменить порядок, в котором находятся подпредставления, но я не могу использовать

 [UIView insertSubview: atIndex:]

В одном конкретном случае, если я вызываю его, чтобы переместить элемент из индекса 2 в индекс 1,вместо этого он помещает его в индекс 0. Вот выходные данные отладчика:

(lldb) po self.subviews
<__NSArrayM 0x600003084f30>(
<ViewA: 0x7fb075cee4c0; frame = (20 12; 399.5 35.32); ...>,
<ViewB: 0x7fb075cf1b60; frame = (20 59.32; 399.5 27.5); ...>,
<ViewC: 0x7fb075cef2c0; frame = (20 98.82; 399.5 67); ...>,
<ViewD: 0x7fb075cfa750; baseClass = UIButton; frame = (20 177.82; 399.5 35); ...>)

(lldb) po self.subviews[2]
<ViewC: 0x7fb075cef2c0; frame = (20 98.82; 399.5 67); ...>

(lldb) po [self insertSubview:self.subviews[2] atIndex:1]
(lldb) po self.subviews
<__NSArrayM 0x600003085020>(
<ViewC: 0x7fb075cef2c0; frame = (20 98.82; 399.5 67); ...>,
<ViewA: 0x7fb075cee4c0; frame = (20 12; 399.5 35.32); ...>,
<ViewB: 0x7fb075cf1b60; frame = (20 59.32; 399.5 27.5); ...>,
<ViewD: 0x7fb075cfa750; baseClass = UIButton; frame = (20 177.82; 399.5 35); ...>)

Как вы можете видеть, я пытался переместить ViewC после ViewA, но вместо этого он пошел до него.Если я вместо этого использую

[UIView insertSubView: aboveSubview:]

Это прекрасно работает.

Я попытался удалить представление перед вставкой, но это дало мне тот же результат.Это очень странно, и я чувствую, что мне не хватает фундаментальной части UIView здесь.Я могу жить с обходным путем, но я действительно предпочел бы понять, почему он не работает.

[ОБНОВЛЕНИЕ] Был один дополнительный бит информации, который оказывается существенным.У меня есть дополнительный CALayer, который я использую, чтобы выделить родительский вид.Так что, если я отключу этот CALayer, то все работает нормально.Я могу ошибаться, но это означает, что insertSubviews фактически перемещает CALayers.Означает ли это, что self.subviews - это просто вспомогательная функция для получения UIViews, связанных с CALayers, на основе self.layer.sublayers ?.Во всяком случае, я нашел своего виновника, и, похоже, в моем понимании CALayers определенно не хватает подвидов.

1 Ответ

0 голосов
/ 07 декабря 2018

Это интересно.

UIView - это просто оболочка для CALayer, которая предоставляет такие функции, как обработка жестов и т. Д. На экране мы видим дерево слоев.Кажется, что параметр индекса, который мы передаем insertSubview:atIndex:, является индексом слоя представления в дереве слоев, что вызывает путаницу.После того, как вы вставите подпредставление, массив subviews упорядочивается в соответствии с положением заднего слоя представлений относительно положения других подпредставлений.

В вашем случае я предполагаю, что ваш выделенный слой имеет индекс 0,вот почему, когда вы вставляете подпредставление в индекс 1, оно переходит в позицию 0 в массиве subviews, потому что его слой поддержки на самом деле ниже уровня всех других подпредставлений и выше CALayer, который вы используете для выделения.

...