Я пытаюсь создать аккордеонный тип uitableviewcell, который, когда пользователь выбирает ячейку, расширяется для отображения подробного информационного представления, встроенного подобно тому, как работает приложение digg.Сначала я попытался заменить текущую табличную ячейку пользовательской ячейкой в cellForRowAtIndex, однако анимация выглядит немного изменчиво, поскольку вы видите заменяемую ячейку, и в целом эффект работает не очень хорошо.
Если вы посмотрите на приложение digg идругим, кто сделал это, кажется, что они не заменяют текущую ячейку, а вместо этого, возможно, добавляют подпредставление в ячейку?Однако первоначальная ячейка, похоже, вообще не оживляет, а только новые аккордеоны вида в таблицу.
У кого-нибудь есть идеи, как добиться подобного эффекта?
Обновление: Я добился некоторого прогресса, используя метод Нехи, приведенный ниже, и пока клетка правильно анимирует, как она наносит ущерб другим ячейкам таблицы.То, что я сделал, это подкласс UITableViewCell с пользовательским классом, который содержит экземпляр UIView, который фактически рисует представление, которое я затем добавляю в представление содержимого ячеек таблицы.
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
if (selected) {
[self expandCell];
}
}
-(void)expandCell {
self.contentView.frame = CGRectMake(0.0, 0.0, self.contentView.bounds.size.width, 110);
}
Вот все методы делегата таблицы, которые я использую:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
if (isSearching && indexPath.row == selectedIndex) {
static NSString *CellIdentifier = @"SearchCell";
CustomTableCell *cell = (CustomTableCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[CustomTableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
[cell setCustomTitle:[timeZoneNames objectAtIndex:indexPath.row] detail:[timeZoneNames objectAtIndex:indexPath.row]];
UILabel *theText = [[UILabel alloc] initWithFrame:CGRectMake(10.0, 10.0, cell.contentView.bounds.size.width -20, 22.0)];
theText.text = @"Title Text";
[cell.contentView addSubview:theText];
UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(10.0, 10 + 46.0, cell.contentView.bounds.size.width - 20, 40.0)];
textField.borderStyle = UITextBorderStyleLine;
[cell.contentView addSubview:textField];
UILabel *testLabel = [[UILabel alloc] initWithFrame:CGRectMake(5.0, 88.0, cell.contentView.bounds.size.width - 20, 22.0)];
testLabel.text = [NSString stringWithFormat:@"Some text here"];
[cell.contentView addSubview:testLabel];
[theText release];
[textField release];
[testLabel release];
return cell;
} else {
static NSString *CellIdentifier = @"Cell";
CustomTableCell *cell = (CustomTableCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[CustomTableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
[cell setCustomTitle:[timeZoneNames objectAtIndex:indexPath.row] detail:[timeZoneNames objectAtIndex:indexPath.row]];
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:NO];
selectedIndex = indexPath.row;
isSearching = YES;
[tableView beginUpdates];
[tableView endUpdates];
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
if (isSearching && indexPath.row == selectedIndex) {
return 110;
}
return rowHeight;
}
Теперь кажется, что ячейка расширяется, но фактически не обновляется, поэтому метки и текстовое поле не используются.показано на рисунке.Однако они появляются, когда я прокручиваю ячейку на экране.
Есть идеи?