1

私が遭遇したすべての問題を説明できるようにするには、これは長い質問になるかもしれません。だから、私はそのようなUI機能を実装したい:

ここに画像の説明を入力

ここに画像の説明を入力

したがって、1つのファイルに実装されているUITableViewがあり、それは他のファイルTableViewCell.mに実装されているセルですそして、ボタンをクリックした後、2番目の画面のようにテキストメッセージでUILabelを展開し、メッセージを閉じるボタンをクリックした後に詳細を読む必要がありますUILabel を復元し、結果として TableView セルのサイズを変更します (これは 1 つのボタンであり、その画像のみを変更します)。したがって、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 ではセルを 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 を使用します-私は知っています最適ではありませんが、ご覧のとおり、最初のクリックからさらに奇妙に動作するかどうかに関係なく、1 つのセルのリロードのコードにコメントしました。また、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 の専門家は私の問題を理解し、この問題の解決策を提案できると思います。私はこの問題を 1 日ではなく解決しようとしているので、本当に助けが必要です。

よろしくお願いします!

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 に答える