在IOS 7中扩展表视图单元格

我正在开发一个iOS应用程序。 我使用了表格视图。 当用户点击任何单元格时,单元格会扩展。 但有些单元格在iOS 7中没有扩展。其他版本运行正常。 以下是示例代码。 我怎样才能纠正它?

- (BOOL)cellIsSelected:(NSIndexPath *)indexPath { // Return whether the cell at the specified index path is selected or not NSNumber *selectedIndex = [selectedIndexes objectForKey:indexPath]; return selectedIndex == nil ? FALSE : [selectedIndex boolValue]; } #pragma mark - Table view data source - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { if([self cellIsSelected:indexPath]) { return 111; } // Cell isn't selected so return single height return 41; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return [self.filteredItineraries count]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *simpleTableIdentifier = @"FlightTracker"; CellFlightTracker *cell = (CellFlightTracker *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; if(cell == nil) { NSArray *nib=nil; nib = [[NSBundle mainBundle] loadNibNamed:@"CellFlightTracker" owner:self options:nil]; cell = [nib objectAtIndex:0]; } if([self cellIsSelected:indexPath]) { cell.backgroundColor=[UIColor blackColor]; }else { cell.backgroundColor=[UIColor darkGrayColor]; } return cell; } - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { if([self cellIsSelected:indexPath]) cell.backgroundColor= [UIColor blackColor]; else cell.backgroundColor= [UIColor darkGrayColor]; } -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ [tableView deselectRowAtIndexPath:indexPath animated:TRUE]; // Toggle 'selected' state BOOL isSelected = ![self cellIsSelected:indexPath]; // Store cell 'selected' state keyed on indexPath NSNumber *selectedIndex = [NSNumber numberWithBool:isSelected]; [selectedIndexes setObject:selectedIndex forKey:indexPath]; // This is where magic happens... [tableView1 beginUpdates]; CellFlightTracker *selectedCell = (CellFlightTracker*)[tableView cellForRowAtIndexPath:indexPath]; if(selectedCell.lblDepartureAirportStatus.hidden) [selectedCell.lblDepartureAirportStatus setHidden:NO]; else [selectedCell.lblDepartureAirportStatus setHidden:YES]; [tableView1 endUpdates]; } 

如果您子类和UITableViewCell并且在调整单元格大小时使用layoutSubviews进行调整会更好。

 //In SMTableViewCell.h @interface SMTableViewCell : UITableViewCell @property (weak, nonatomic) IBOutlet UILabel *statusLabel; @property (weak, nonatomic) IBOutlet UIButton *seeMoreButton; //SMTableViewCell.m - (void)layoutSubviews { CGRect labelFrame = self.statusLabel.frame; labelFrame.size.height = self.frame.size.height - 55.0f; self.statusLabel.frame = labelFrame; CGRect buttonFrame = self.seeMoreButton.frame; buttonFrame.origin.y = labelFrame.origin.y+labelFrame.size.height+10.0f; self.seeMoreButton.frame = buttonFrame; } 

保留一个数组来存储selectedIndexPaths

 @property (nonatomic, strong) NSMutableArray *selectedIndexPaths; 

计算单元格的高度

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; { BOOL isSelected = [self.selectedIndexPaths containsObject:indexPath]; CGFloat maxHeight = MAXFLOAT; CGFloat minHeight = 40.0f; CGFloat constrainHeight = isSelected?maxHeight:minHeight; CGFloat constrainWidth = tableView.frame.size.width - 20.0f; NSString *text = self.items[indexPath.row]; CGSize constrainSize = CGSizeMake(constrainWidth, constrainHeight); CGSize labelSize = [text sizeWithFont:[UIFont systemFontOfSize:15.0f] constrainedToSize:constrainSize lineBreakMode:NSLineBreakByCharWrapping]; return MAX(labelSize.height+75, 100.0f); } 

初始化自定义显示更多TableViewCell

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellIdentifier = @"CellIdentifier"; SMTableViewCell *cell= (SMTableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier]; if (cell == nil) { cell = [[[NSBundle mainBundle]loadNibNamed:NSStringFromClass([SMTableViewCell class]) owner:nil options:nil] lastObject]; } BOOL isSelected = [self.selectedIndexPaths containsObject:indexPath]; cell.statusLabel.numberOfLines = isSelected?0:2; NSString *text = self.items[indexPath.row]; cell.statusLabel.text = text; NSString *buttonTitle = isSelected?@"See Less":@"See More"; [cell.seeMoreButton setTitle:buttonTitle forState:UIControlStateNormal]; [cell.seeMoreButton addTarget:self action:@selector(seeMoreButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; [cell.seeMoreButton setTag:indexPath.row]; cell.selectionStyle = UITableViewCellSelectionStyleNone; return cell; } 

按钮单击事件方法

 - (void)seeMoreButtonPressed:(UIButton *)button { NSIndexPath *indexPath = [NSIndexPath indexPathForRow:button.tag inSection:0]; [self addOrRemoveSelectedIndexPath:indexPath]; } - (void)addOrRemoveSelectedIndexPath:(NSIndexPath *)indexPath { if (!self.selectedIndexPaths) { self.selectedIndexPaths = [NSMutableArray new]; } BOOL containsIndexPath = [self.selectedIndexPaths containsObject:indexPath]; if (containsIndexPath) { [self.selectedIndexPaths removeObject:indexPath]; }else{ [self.selectedIndexPaths addObject:indexPath]; } [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; } 

如果选择了单元格,则会给出相同的事件

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath:indexPath animated:YES]; [self addOrRemoveSelectedIndexPath:indexPath]; } 

示例演示项目链接。

Interesting Posts