Нужно ли мне создавать настраиваемое представление (т. е. подкласс UIView, в котором я переопределяю drawRect), чтобы в конечном итоге создать массив, содержащий эти настраиваемые представления? Потому что в конечном итоге я хочу создать scrollView, который реализует управление страницей и отображает несколько представлений (т. Е. Массив пользовательских представлений) на отдельных страницах. Представления — это просто UIImage над тремя кнопками. Причем изображение для одного вида разное для другого вида (например, электронные флешки).
Массив представлений (представления с UIImage и 3 кнопками): нужен ли пользовательский вид/drawRect?
Ответы (1)
Не похоже, что вам нужно пользовательское представление для переопределения drawRect:
, так как вы хотите создать представление коллекции, используя одно представление изображения и три кнопки. Однако не помешает создать его, чтобы доступ к подпредставлениям можно было осуществлять через именованные свойства. Например, customObject.imageView
и customObject.firstButton
. Как единое целое имеет смысл создать его, так как будет грязно отслеживать все представления изображений и кнопки, которые вы в конечном итоге добавили бы в представление прокрутки в противном случае.
person
Deepak Danduprolu
schedule
21.06.2011
Спасибо Дипак. Вы говорили, что мне не нужно переопределять drawRect: даже если я создаю собственный вид? Потому что если бы не это то, что я предпочел бы сделать. Я просто не уверен, как подойти к созданию пользовательского представления без переопределения drawRect: (т.е. какие другие методы использовать в пользовательском представлении).
- person NateHill; 21.06.2011
Ой! Неважно. Я могу просто сделать это из initWithFrame:, верно? :-) Еще раз спасибо Дипак
- person NateHill; 21.06.2011
Извините за поздний ответ. Да, в основном вы можете сделать это в
initWithFrame:
, где вы назначаете кадры для каждого из подпредставлений, а также устанавливаете их маски автоматического изменения размера, чтобы они могли реагировать на изменение размера кадра пользовательского представления и соответствующим образом настраивались. Если вы считаете, что вам нужно изменить макет на основе какого-либо параметра, вам придется реализовать layoutSubviews
. Когда вы изменяете этот параметр, вы можете просто вызвать setNeedsLayout
.
- person Deepak Danduprolu; 21.06.2011
Что касается
drawRect:
, реализация по умолчанию ничего не делает. Таким образом, вы также можете ничего не делать, если требуется. Просто подтверждаю то, что вам нужно.
- person Deepak Danduprolu; 21.06.2011
Еще одна мысль, которая приходит мне в голову, заключается в том, что если три кнопки одинаково влияют на изображение. Вместо этого вы должны подумать о том, чтобы поместить их на панель инструментов и, основываясь на том, какое изображение на экране, работать с этим изображением. Таким образом, вы, вероятно, даже можете исключить настраиваемое представление в этом случае. Это всего лишь предложение, поскольку я не совсем понимаю, что именно вы пытаетесь сделать.
- person Deepak Danduprolu; 21.06.2011
Спасибо за ваше предложение панели инструментов, Дипак :-) Я думаю, что панель инструментов была бы идеальной с точки зрения устранения пользовательского представления. Я ограничил это бета-приложение портретным режимом, и в конечном итоге я собираюсь добавить небольшую текстовую аннотацию над или под изображением, поэтому в этом конкретном случае я думаю, что может быть лучше просто убрать настраиваемый вид. :-) Я определенно ценю ваше предложение - и все ваши отзывы.
- person NateHill; 21.06.2011
Кстати, @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
Да, проблема в том, что инициализатор
initWithCoder:
будет вызываться при использовании построителя интерфейса.
- person Deepak Danduprolu; 21.06.2011
Гоша ты классный. Спасибо за разъяснение, Дипак :-)
- person NateHill; 21.06.2011