Добавление кнопки (UIButton) в пользовательскую ячейку табличного представления, нарисованную с помощью drawRect: - PullRequest
0 голосов
/ 02 апреля 2011

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

if([self needsExpansion]) {
    [self addExpansionButton];
}

-(void)addExpansionButton {

    self.accessoryButton = [UIButton buttonWithType:UIButtonTypeCustom];
[self.accessoryButton setShowsTouchWhenHighlighted:YES];
UIImage *buttonImage = [UIImage imageNamed:@"blue_arrow_collaps_icon.png"];
[self.accessoryButton setFrame:CGRectMake(280, 82, buttonImage.size.width, buttonImage.size.height)];
[self.accessoryButton setImage:buttonImage forState:UIControlStateNormal];
[self.accessoryButton addTarget:self action:@selector(toggleExpanded) forControlEvents:UIControlEventTouchUpInside];    
[self addSubview:self.accessoryButton];
}

Это работает нормально, за исключением того, что когда я щелкаю в другом месте ячейки, кнопка мигает и исчезает.Кто-нибудь знает, как правильно это сделать?

1 Ответ

2 голосов
/ 02 апреля 2011

Из ссылки на класс UITableViewCell :

У вас есть два способа продления стандартный объект UITableViewCell за пределами данные стили. Чтобы создать ячейки с множественный, по-разному отформатированный и размерные строки и изображения для контента, вы можете получить представление содержимого ячейки (через его свойство contentView) и добавить к нему подпредставления.

Вместо добавления вспомогательной кнопки в качестве подпредставления UITableViewCell, вы должны добавить ее в качестве подпредставления contentView:

[[self contentView] addSubview:self.accessoryButton];

Разработали ли вы следующую проблему в своем подходе к дизайну ?: Допустим, одна из ваших ячеек (назовем это A) определяет, что она нуждается в расширении, поэтому вы добавляете к ней кнопку. Что происходит, когда пользователь прокручивает UITableView? По соображениям производительности ваш делегат UITableView должен использовать dequeueReusableCellWithIdentifier в tableView: cellForRowAtIndexPath :. Таким образом, вы будете повторно использовать A для отображения другой строки таблицы. Вы действительно хотите, чтобы у А была дополнительная кнопка? Наверное, нет, поскольку теперь он представляет другой объект.

Возможно, вам лучше выполнить настройку ячейки в UITextViewDelegate. В tableView: cellForRowAtIndexPath: вы можете определить, нуждается ли кнопка, отображаемая для объекта, отображаемого в указанной строке, и добавляет ли она его в качестве подпредставления для contentView.

Опять же, если размер вашего стола всегда относительно мал (скажем, <50), вы можете использовать <a href="http://blog.ourbeautifulfaces.com/post/76428376/devtip-dont-always-recycle-uitableviewcells" rel="nofollow"> этот подход, который предлагает Джереми Хант Шенхерр.

...