Добавление подвидов поверх программно созданной иерархии UIView

У меня есть подкласс UIView, который программно создает и добавляет несколько подвидов. Однако я хочу дать пользователям класса возможность размещать новые подпредставления поверх него (и его подпредставлений) с помощью addSubview и, в идеале, также из Interface Builder.

Как лучше всего это сделать?

Теперь я полагаю, что было бы приемлемо добавлять представления только программно, используя addSubview, но я не уверен, как бы я это сделал.

ПРИМЕЧАНИЕ. Я попытался добавить дополнительные подпредставления с помощью построителя интерфейса, но они скрыты, как только пользовательский подкласс UIView, о котором я упоминал выше, программно создает другие представления, предположительно, поскольку они добавляются последними.


person Tom    schedule 09.02.2012    source источник


Ответы (1)


Просто перетащите общий UIView в наконечник в Interface Builder и установите его класс в свой пользовательский подкласс. Вы по-прежнему можете делать все, что могли, со старым простым UIView, включая перетаскивание подпредставлений.

Вы не сможете увидеть, как на самом деле выглядит пользовательское подпредставление в Interface Builder; это будет просто серый прямоугольник. Вы могли бы (я думаю) сделать это в Xcode 3 с плагинами IB, но, по крайней мере, на данный момент Xcode 4 не поддерживает такие плагины.

РЕДАКТИРОВАТЬ:

Чтобы решить последующие действия OP, вам необходимо программно управлять z-упорядочением. Вероятно, проще всего оставить код как есть, но вместо того, чтобы делать что-то вроде:

UIView *mySubview1 = ...;
UIView *mySubview2 = ...;
UIView *mysubview3 = ...;
[self addSubview:mySubview1];
[self addSubview:mySubview2];
[self addsubview:mySubview3];

(который, как вы заметили, вполне может накладывать подвиды поверх подвидов пользователя)

Сделайте что-нибудь вроде:

UIView *container = [[UIView alloc] initWithFrame:[self bounds]];
UIView *mySubview1 = ...;
UIView *mySubview2 = ...;
UIView *mysubview3 = ...;
[container addSubview:mySubview1];
[container addSubview:mySubview2];
[container addsubview:mySubview3];
[self addSubview:container];
[self sendSubviewToBack:container];
[container release];

В качестве альтернативы вы можете использовать [self insertSubview:container atIndex:0], но я думаю, что добавление и перемещение на задний план немного понятнее при беглом просмотре кода.

Конечным результатом является то, что вам не нужно возиться с существующим z-порядком ваших подпредставлений; поместив их в один легко управляемый контейнер, вы можете переместить всю коллекцию в любое место в иерархии подвидов.

person Conrad Shultz    schedule 09.02.2012
comment
Это то, что я пробовал изначально. К сожалению, поскольку пользовательский класс добавляет свои другие подвиды программно, они появляются поверх представлений, которые я добавил в IB. - person Tom; 10.02.2012
comment
Я думаю, тебе следует сделать [self.view addSubview:mySubview1]; - person Supertecnoboff; 13.11.2015