私が遭遇したすべての問題を説明できるようにするには、これは長い質問になるかもしれません。だから、私はそのような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 日ではなく解決しようとしているので、本当に助けが必要です。
よろしくお願いします!