1

这可能是一个很长的问题,以便我能够解释我遇到的所有问题。所以,我想实现这样的 UI 功能:

在此处输入图像描述

在此处输入图像描述

所以我有一个在一个文件中实现的 UITableView,它是在另一个文件 TableViewCell.m 中实现的单元格,我需要在单击按钮后阅读更多内容以在第二个屏幕上使用文本消息展开 UILabel,然后单击关闭消息按钮恢复 UILabel 并因此调整 TableView 单元格的大小(这是一个按钮,我只更改它的图像)。因此,为了调整 UILabel 的大小,我使用 [UILabel sizeToFit] 并将 label.numberOfLines 从 3 更改为 0(据我所知是 iOS 6 功能)。这里创建单元格的代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:  (NSIndexPath *)indexPath {
CPNTalkCell *cell = (CPNTalkCell *)[tableView  dequeueReusableCellWithIdentifier:kCellIdentifier];
NSString *modelId = [[models objectAtIndex:indexPath.row] valueForKey:@"modelId"];
NSDictionary *model = [[models objectAtIndex:indexPath.row] valueForKey:@"model"];
return [self setupCell:cell forModel:model withId:modelId];
}

在 setupCell 方法中,我进行了额外的调整,在 CPNTalkCell 中,单元格被描述为 vi IB。这里是按钮 ReadMore 事件处理程序的代码,我尝试调整单元格和标签的大小:

-(void)ResizeLabel:(id)sender
{
  UIView* sender_button = (UIView*)sender;
  UIButton* _resizingSenderButton = (UIButton*)sender;
  CGRect _button_before = _resizingSenderButton.frame;
  NSIndexPath* indexPath = [listView indexPathForCell:(UITableViewCell*)[[ sender_button superview]superview ]]; //In such an ugly way may be i
  //access NSIndexpath of the current cell from
  // which button was clicked
  CPNTalkCell *cell = (CPNTalkCell*)[listView cellForRowAtIndexPath:indexPath];
  if (cell.messageLabel.numberOfLines==3) {
  [self.listView  beginUpdates];
  cell.messageLabel.numberOfLines=0;
  [cell.messageLabel sizeToFit];
  _button_before.origin.y = cell.messageLabel.frame.origin.y+ cell.messageLabel.frame.size.height+7;
  _resizingSenderButton.frame=_button_before;
 [_resizingSenderButton setBackgroundImage:[UIImage imageNamed:@"readmore2.png" ] forState:UIControlStateNormal];
 [cell sizeToFit];
 //  [self.listView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationTop];
 [self.listView reloadData];
 [self.listView endUpdates];
 }
  else
 {
  cell.messageLabel.numberOfLines = 3;
  [self.listView  beginUpdates];
  [cell.messageLabel sizeToFit];
   CGRect _button_after = _resizingSenderButton.frame;
  _button_after.origin.y = cell.messageLabel.frame.origin.y+ cell.messageLabel.frame.size.height+7;
  _resizingSenderButton.frame=_button_after;
  [_resizingSenderButton setBackgroundImage:[UIImage imageNamed:@"readmore1.png" ] forState:UIControlStateNormal];
  [cell sizeToFit];
  [self.listView reloadData];
  //[self.listView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationTop];
  [self.listView endUpdates];
  }
   }

因此,此代码有效,并且在单击单元格后调整大小以适应文本,它的长度但工作很奇怪 - 有时按钮会在滚动列表按钮后消失或出现在文本上,也可能会消失甚至是文本。我在更改单元格时使用 reloadData - 我知道这不是最佳的,但正如您所见,我已经评论了重新加载一个单元格的代码,因为它在第一次点击时会更加奇怪或不工作。我还重载了 heightForRowatIndexPath:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *modelId = [[models objectAtIndex:indexPath.row] valueForKey:@"modelId"];
NSDictionary *model = [[models objectAtIndex:indexPath.row] valueForKey:@"model"];
CPNTalkCell *cell = [_cells objectForKey:modelId];

if (cell == nil) {
    cell = [self setupCell:nil forModel:model withId:modelId];
}

return cell.rowHeight;
}

但在其中我描述了初始单元格参数,然后通过调用 TalkCell 文件中描述的 rowHeight 单击按钮!

我知道这是一个很长的问题,有时我解释得不是很清楚,但我认为 iOS 专家将能够理解我的问题并提出解决方案。我真的需要帮助,因为我试图解决这个问题不是一天。

非常感谢提前!

4

1 回答 1

0

您需要重载heightForRowAtIndexPath以根据展开的单元格返回适当的值

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *mode

    lId = [[models objectAtIndex:indexPath.row] valueForKey:@"modelId"];
    NSDictionary *model = [[models objectAtIndex:indexPath.row] valueForKey:@"model"];
    CPNTalkCell *cell = [_cells objectForKey:modelId];

    if (cell == nil) {
        cell = [self setupCell:nil forModel:model withId:modelId];
    }

    if ( indexPath == expandedIndexPath )//save the expanded cell's index path somewhere
    {
        return expandedCellHeight;
    }

    return cell.rowHeight;
}
于 2013-01-25T14:53:11.933 回答