Массив представлений (представления с UIImage и 3 кнопками): нужен ли пользовательский вид/drawRect?

Нужно ли мне создавать настраиваемое представление (т. е. подкласс UIView, в котором я переопределяю drawRect), чтобы в конечном итоге создать массив, содержащий эти настраиваемые представления? Потому что в конечном итоге я хочу создать scrollView, который реализует управление страницей и отображает несколько представлений (т. Е. Массив пользовательских представлений) на отдельных страницах. Представления — это просто UIImage над тремя кнопками. Причем изображение для одного вида разное для другого вида (например, электронные флешки).


person NateHill    schedule 21.06.2011    source источник


Ответы (1)


Не похоже, что вам нужно пользовательское представление для переопределения drawRect:, так как вы хотите создать представление коллекции, используя одно представление изображения и три кнопки. Однако не помешает создать его, чтобы доступ к подпредставлениям можно было осуществлять через именованные свойства. Например, customObject.imageView и customObject.firstButton. Как единое целое имеет смысл создать его, так как будет грязно отслеживать все представления изображений и кнопки, которые вы в конечном итоге добавили бы в представление прокрутки в противном случае.

person Deepak Danduprolu    schedule 21.06.2011
comment
Спасибо Дипак. Вы говорили, что мне не нужно переопределять drawRect: даже если я создаю собственный вид? Потому что если бы не это то, что я предпочел бы сделать. Я просто не уверен, как подойти к созданию пользовательского представления без переопределения drawRect: (т.е. какие другие методы использовать в пользовательском представлении). - person NateHill; 21.06.2011
comment
Ой! Неважно. Я могу просто сделать это из initWithFrame:, верно? :-) Еще раз спасибо Дипак - person NateHill; 21.06.2011
comment
Извините за поздний ответ. Да, в основном вы можете сделать это в initWithFrame:, где вы назначаете кадры для каждого из подпредставлений, а также устанавливаете их маски автоматического изменения размера, чтобы они могли реагировать на изменение размера кадра пользовательского представления и соответствующим образом настраивались. Если вы считаете, что вам нужно изменить макет на основе какого-либо параметра, вам придется реализовать layoutSubviews. Когда вы изменяете этот параметр, вы можете просто вызвать setNeedsLayout. - person Deepak Danduprolu; 21.06.2011
comment
Что касается drawRect:, реализация по умолчанию ничего не делает. Таким образом, вы также можете ничего не делать, если требуется. Просто подтверждаю то, что вам нужно. - person Deepak Danduprolu; 21.06.2011
comment
Еще одна мысль, которая приходит мне в голову, заключается в том, что если три кнопки одинаково влияют на изображение. Вместо этого вы должны подумать о том, чтобы поместить их на панель инструментов и, основываясь на том, какое изображение на экране, работать с этим изображением. Таким образом, вы, вероятно, даже можете исключить настраиваемое представление в этом случае. Это всего лишь предложение, поскольку я не совсем понимаю, что именно вы пытаетесь сделать. - person Deepak Danduprolu; 21.06.2011
comment
Спасибо за ваше предложение панели инструментов, Дипак :-) Я думаю, что панель инструментов была бы идеальной с точки зрения устранения пользовательского представления. Я ограничил это бета-приложение портретным режимом, и в конечном итоге я собираюсь добавить небольшую текстовую аннотацию над или под изображением, поэтому в этом конкретном случае я думаю, что может быть лучше просто убрать настраиваемый вид. :-) Я определенно ценю ваше предложение - и все ваши отзывы. - person NateHill; 21.06.2011
comment
Кстати, @Deepak в моем файле реализации для моего пользовательского представления я сделал следующее: - (id)initWithFrame:(CGRect:frame { self = [super initWithFrame:frame]; if (self) { UILabel *label = [[UILabel alloc] initWithFrame:self.bounds] autorelease]; label.text = @"Test"; [self addSubview:label]; } return self; } Затем я добавил UIView в Interface Builder и назначил его своим классом пользовательского представления. Хотя ярлык не появляется. Есть предположения? - person NateHill; 21.06.2011
comment
Да, проблема в том, что инициализатор initWithCoder: будет вызываться при использовании построителя интерфейса. - person Deepak Danduprolu; 21.06.2011
comment
Гоша ты классный. Спасибо за разъяснение, Дипак :-) - person NateHill; 21.06.2011