У меня есть контроллер представления, который содержит подробности сообщения и представление таблицы. Ячейки таблицы являются пользовательскими. Я поместил uilabel, uibutton & uitextview в камеру. Эта ячейка таблицы содержит комментарии и ответы на пост. Таким образом, высота ячейки таблицы является динамической. Если комментарий имеет ответы, то высота ячейки отображается правильно. Но если комментарий не имеет ответа, то высота ячейки таблицы вычисляется неправильно. Я хочу, чтобы высота ячейки таблицы и таблицы была динамической в соответствии с содержимым ячейки. Мой контроллер представления содержит другое представление, известное как «представление содержимого», в которое я поместил подробности публикации и представление моей таблицы. Ниже мое изображение, которое даст вам представление о моем взгляде. На рисунке ниже показано только представление.
Вот мой код
#define TABLE_CELL_HEIGHT 200.0f
#define ADD_VIEW_HEIGHT 30.0f
#define FONT_SIZE 24.0f
#define CELL_CONTENT_WIDTH 720.0f
#define CELL_CONTENT_MARGIN 50.0f
#define SectionHeight 50.0f
#define LEFT_MARGIN 25
#define RIGHT_MARGIN 25
#define TOP_MARGIN 35
#define BOTTOM_MARGIN 50
#define BOTTOM_FOOTER_MARGIN 32
#define DOC_WIDTH 768
#define DOC_HEIGHT 910
- (void)viewDidLoad
{
[super viewDidLoad];
[self createUserInterface];
[self createCommentUserInterface];
self.contentView.backgroundColor = SET_BACKGROUND_IMAGE;
self.view.backgroundColor = SET_BACKGROUND_IMAGE;
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self displayCommentsForPhotoID:[post ID]];
[self.commentsTableView reloadData];
CGRect frame = self.commentsTableView.frame;
frame.size.height = TABLE_CELL_HEIGHT*[commentsArray count];
self.commentsTableView.frame = frame;
CGRect viewFrame = self.contentView.frame;
viewFrame.size.height = viewFrame.size.height + (TABLE_CELL_HEIGHT*[commentsArray count]) + ADD_VIEW_HEIGHT;
self.contentView.frame = viewFrame;
[self.scrollView addSubview:self.contentView];
self.scrollView.contentSize = self.contentView.bounds.size;
}
-(void)createCommentUserInterface {
UILabel *lblComments = [[UILabel alloc]initWithFrame:CGRectMake(20.0f, 570.0f, 150.0f, 30.0f)];
[lblComments setBackgroundColor:[UIColor clearColor]];
[lblComments setText:@"Comments"];
[self.contentView addSubview:lblComments];
UIButton *btnAddComment = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[btnAddComment addTarget:self
action:@selector(btnAddCommentPressed)
forControlEvents:UIControlEventTouchDown];
[btnAddComment setBackgroundImage:[UIImage imageNamed:@"btn_addcomment.png"] forState:UIControlStateNormal];
btnAddComment.frame = CGRectMake(20.0f, 610.0f, 140.0f, 40.0f);
[self.contentView addSubview:btnAddComment];
commentsTableView = [[UITableView alloc]initWithFrame:CGRectMake(20.0f, 660.0f, 280.0f, 600.0f) style:UITableViewStylePlain];
commentsTableView.delegate = self;
commentsTableView.dataSource = self;
[self.contentView addSubview:commentsTableView];
}
#pragma mark - Table view data source
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return 1;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [self.commentsArray count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell;
cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
cell = nil;
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
[tableView setSeparatorColor:[UIColor darkGrayColor]];
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
cell.backgroundColor = [UIColor whiteColor];
userComment = [commentsArray objectAtIndex:[indexPath row]];
UILabel *lblSubmittedBy = [[UILabel alloc]initWithFrame:CGRectMake(10.0f, 5.0f, 100.0f, 30.0f)];
[lblSubmittedBy setText:@"Submitted by"];
[cell addSubview:lblSubmittedBy];
UIButton *btnUserName = [UIButton buttonWithType:UIButtonTypeCustom];
btnUserName.frame = CGRectMake(120.0f, 5.0f, 150.0f, 30.0f);
[btnUserName setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft];
[btnUserName setBackgroundColor:[UIColor clearColor]];
[btnUserName setTitleColor:[UIColor cyanColor] forState:UIControlStateNormal];
[btnUserName addTarget:self action:@selector(showUserProfileForUserComment:) forControlEvents:UIControlEventTouchUpInside];
[btnUserName setUserInteractionEnabled:YES];
[cell addSubview:btnUserName];
UILabel *lblOnDate = [[UILabel alloc]initWithFrame:CGRectMake(10.0f, 40.0f, 20.0f, 30.0f)];
[lblOnDate setText:@"on"];
[cell addSubview:lblOnDate];
UILabel *lblDate = [[UILabel alloc]initWithFrame:CGRectMake(35.0f, 40.0f, 200.0f, 30.0f)];
[cell addSubview:lblDate];
UITextView *txtVwComments = [[UITextView alloc]initWithFrame:CGRectMake(5.0f, 75.0f, 265.0f, 70.0f)];
txtVwComments.backgroundColor = cell.backgroundColor;
[txtVwComments setFont:[UIFont fontWithName:@"Helvetica" size:17.0f]];
[txtVwComments setEditable:NO];
[cell addSubview:txtVwComments];
[txtVwComments setText:[userComment Comment]];
CGRect frame = txtVwComments.frame;
frame.size.height = txtVwComments.contentSize.height;
CGFloat height = frame.size.height;
NSLog(@"Value of height => %f",height);
txtVwComments.frame = frame;
CGFloat ht1 = height + 20.0f + 75.0f;
UIButton *btnUpVote = [[UIButton alloc]initWithFrame:CGRectMake(10.0f, ht1 + 10.0f, 16.0f, 16.0f)];
[btnUpVote setBackgroundColor:[UIColor clearColor]];
[btnUpVote setBackgroundImage:[UIImage imageNamed:@"thumb_up.png"] forState:UIControlStateNormal];
[btnUpVote addTarget:self
action:@selector(btnUpVotePressed:)
forControlEvents:UIControlEventTouchDown];
[btnUpVote setTag:[userComment ID]];
[cell addSubview:btnUpVote];
NSLog(@"Value of ht1 => %f",ht1);
lblUpVoteCount = [[UILabel alloc]initWithFrame:CGRectMake(36.0f, ht1 , 30.0f, 30.0f)];
[lblUpVoteCount setTag:[userComment ID]];
[cell addSubview:lblUpVoteCount];
UIButton *btnDownVote = [[UIButton alloc]initWithFrame:CGRectMake(90.0f, ht1 + 10.0f , 16.0f, 16.0f)];
[btnDownVote setBackgroundColor:[UIColor clearColor]];
[btnDownVote setBackgroundImage:[UIImage imageNamed:@"thumb_down.png"] forState:UIControlStateNormal];
[btnDownVote addTarget:self
action:@selector(btnDownVotePressed:)
forControlEvents:UIControlEventTouchDown];
[btnDownVote setTag:[userComment ID]];
[cell addSubview:btnDownVote];
lblDownVoteCount = [[UILabel alloc]initWithFrame:CGRectMake(116.0f, ht1 , 40.0f, 30.0f)];
[lblDownVoteCount setTag:[userComment ID]];
[cell addSubview:lblDownVoteCount];
UIButton *btnReply = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btnReply.frame = CGRectMake(180.0f, ht1, 60.0f, 30.0f);
[btnReply setBackgroundColor:[UIColor clearColor]];
[btnReply setBackgroundImage:[UIImage imageNamed:@"btn_reply.png"] forState:UIControlStateNormal];
[btnReply addTarget:self action:@selector(btnReplyPressed:) forControlEvents:UIControlEventTouchDown];
[btnReply setTag:[userComment ID]];
[cell addSubview:btnReply];
float y = ht1 + 40.0f;
for (int i=0; i < [userComment.replyArray count]; i++) {
if ([userComment.replyArray objectAtIndex:i] != nil) {
UITextView *txtVwReply = [[UITextView alloc]initWithFrame:CGRectMake(40.0f, y , 220.0,60.0f)];
[txtVwReply setUserInteractionEnabled:NO];
[txtVwReply setFont:[UIFont fontWithName:@"Helvetica" size:14.0f]];
[cell addSubview:txtVwReply];
commentReply = [userComment.replyArray objectAtIndex:i];
NSLog(@"userComment.replyArray => %@",userComment.replyArray);
NSLog(@"commReply object => %@",commentReply);
strReply = [NSString stringWithFormat:@"Submitted by %@ \n on %@\n %@",[commentReply ReplyUsername],[commentReply ReplyDateAdded],[commentReply ReplyComment]];
NSLog(@"strReply => %@",strReply);
[txtVwReply setText:strReply];
[txtVwReply release];
y = y +80;
}
}
[btnUserName setTitle:[userComment Username] forState:UIControlStateNormal];
[lblDate setText:[userComment DateAdded]];
[lblUpVoteCount setText:[NSString stringWithFormat:@"%i",[userComment UpVotes]]];
[lblDownVoteCount setText:[NSString stringWithFormat:@"%i",[userComment DownVotes]]];
[lblSubmittedBy release];
[lblOnDate release];
[lblDate release];
[txtVwComments release];
[btnUpVote release];
[lblUpVoteCount release];
[btnDownVote release];
[lblDownVoteCount release];
return cell;
}
#pragma mark - Table view delegate
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
// I don't want this event
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([commentsArray count]>0) {
userComment = [commentsArray objectAtIndex:indexPath.row];
NSString *strComment =userComment.Comment;
NSLog(@"strComment : - %@",strComment);
CGFloat replyHeight = 50.0f;
if([userComment.replyArray count]>0) {
for (int i=0; i < [userComment.replyArray count]; i++) {
commentReply = [userComment.replyArray objectAtIndex:i];
NSString *strCommentReply = commentReply.ReplyComment;
NSLog(@"strCommentReply => %@",strCommentReply);
[strCommentReply stringByAppendingFormat:@"\n %@",strCommentReply];
replyHeight = replyHeight + 50;
}
}
CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);
CGSize sizeComment = [strComment sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];
CGFloat height = MAX(sizeComment.height + replyHeight, 44.0f);
NSLog(@"height %f",height);
NSLog(@"height + (CELL_CONTENT_MARGIN ) + TABLE_CELL_HEIGHT => %f",height + (CELL_CONTENT_MARGIN ) + TABLE_CELL_HEIGHT);
NSLog(@"TABLE_CELL_HEIGHT - %f",height + (CELL_CONTENT_MARGIN ) + TABLE_CELL_HEIGHT);
return height + (CELL_CONTENT_MARGIN ) + TABLE_CELL_HEIGHT;
}
NSLog(@"TABLE_CELL_HEIGHT - %f",TABLE_CELL_HEIGHT);
return TABLE_CELL_HEIGHT;
}
Пожалуйста, объясните мне этот вопрос. Спасибо
ОБНОВЛЕНИЕ КОДА
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// Code for placing UI components on the cell .Same as above code
float y = ht1 + 40.0f;
for (int i=0; i < [userComment.replyArray count]; i++) {
if ([userComment.replyArray objectAtIndex:i] != nil) {
UITextView *txtVwReply = [[UITextView alloc]initWithFrame:CGRectMake(40.0f, y , 220.0,0.0f)];
[txtVwReply setUserInteractionEnabled:NO];
[txtVwReply setFont:[UIFont fontWithName:@"Helvetica" size:14.0f]];
[cell addSubview:txtVwReply];
commentReply = [userComment.replyArray objectAtIndex:i];
NSLog(@"userComment.replyArray => %@",userComment.replyArray);
NSLog(@"commReply object => %@",commentReply);
strReply = [NSString stringWithFormat:@"Submitted by %@ \n on %@\n %@",[commentReply ReplyUsername],[commentReply ReplyDateAdded],[commentReply ReplyComment]];
NSLog(@"strReply => %@",strReply);
[txtVwReply setText:strReply];
CGRect frame = txtVwReply.frame;
frame.size.height = txtVwReply.contentSize.height;
CGFloat height = frame.size.height;
NSLog(@"Value of height => %f",height);
txtVwReply.frame = frame;
y = y + 80;
[txtVwReply release];
}
}
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([commentsArray count]>0) {
userComment = [commentsArray objectAtIndex:indexPath.row];
NSString *strComment =userComment.Comment;
NSLog(@"strComment : - %@",strComment);
CGFloat replyHeight = 135.0f;
if([userComment.replyArray count]>0) {
for (int i=0; i < [userComment.replyArray count]; i++) {
commentReply = [userComment.replyArray objectAtIndex:i];
NSString *strCommentReply = commentReply.ReplyComment;
NSLog(@"strCommentReply => %@",strCommentReply);
// Append all the reply & then use to determine hight
[strCommentReply stringByAppendingFormat:@"\n %@",strCommentReply];
replyHeight = replyHeight + 100.0f;
}
}
CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);
CGSize sizeComment = [strComment sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];
CGFloat height = MAX(sizeComment.height + replyHeight + 40.0f, 44.0f);
NSLog(@"height %f",height);
NSLog(@"height + (CELL_CONTENT_MARGIN ) + TABLE_CELL_HEIGHT => %f",height + (CELL_CONTENT_MARGIN ) + TABLE_CELL_HEIGHT);
NSLog(@"TABLE_CELL_HEIGHT - %f",height + (CELL_CONTENT_MARGIN ) + TABLE_CELL_HEIGHT);
return height;
}
NSLog(@"TABLE_CELL_HEIGHT - %f",TABLE_CELL_HEIGHT);
return TABLE_CELL_HEIGHT;
}