Высота ячейки динамического представления таблицы в iphone с использованием xcode 4

У меня есть контроллер представления, который содержит сведения о сообщениях и представление таблицы. Ячейки таблицы произвольные. Я поместил 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;
}

person iOSAppDev    schedule 09.10.2011    source источник
comment
Когда вы говорите, что он рассчитан неправильно, что вы имеете в виду? Слишком маленький, слишком большой?   -  person jrturton    schedule 09.10.2011
comment
каков вывод этих строк NSLog. Вы возвращаете ожидаемые числа из heightForRowAtIndexPath?   -  person Dean Davids    schedule 09.10.2011


Ответы (3)


Я не вижу, где вы реализовали метод делегата tableview:

 -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 

именно здесь я хотел бы проверить ваш контент и указать размер ячейки.

person Dean Davids    schedule 09.10.2011
comment
листайте вниз - это реализовано - person Colin; 09.10.2011

Мне кажется, ваши расчеты неверны. Если я буду следовать ему правильно, я предполагаю, что с несколькими ответами он выйдет только близко к правильному размеру. Слишком много комментариев, и он будет слишком маленьким, без комментариев высота вашей ячейки будет слишком большой. Это связано с тем, что вы в основном вычисляете общую высоту строки как:

50,0 (начальное значение для responseHeight) + commentHeight + (50,0 x responseArray.count)

это будет 50 + высота ваших комментариев, если нет ответов (обратите внимание, что никогда не будет меньше 44, поэтому ваш MAX никогда не вернет меньше). Затем вы добавляете константы TCM и CCH, итого получается 300 + высота комментариев.

В вашей ячейке ForRowAtIndexPath кажется, что вам понадобится только 135,0 + высота комментария только для комментария. Поэтому, если у вас нет ответов, у вас будет строка почти в два раза больше необходимого. Причина, по которой это будет выглядеть правильно с несколькими ответами, заключается в том, что вы используете 80,0 для каждого ответа, но добавляете только 50,0 к высоте строки. Каждый раз он приближается на 30 пунктов, а затем примерно через 4 или 5 итераций выровняется. Еще немного, и он станет слишком маленьким.

Я думаю, что если вы инициализируете responseHeight значением 135,0 и измените приращение responseHeight на 80, а не на 50,0, расчет должен быть более точным. Я мог бы немного ошибиться, так как в этом браузере за этим трудно следить. Затем удалите две переменные TABLE_CONTENT_MARGIN и TABLE_CELL_HEIGHT из возвращаемого значения. Возвращаемое значение 135 + commentHeight + (80 x responseArray.count) должно быть правильным. Вам не нужно перебирать комментарии, так как вы не используете строку ни для чего, что я вижу. Вам также может понадобиться этот T_C_M, но вы должны убедиться, что это достаточно легко, когда вы играете с ним.

person Dean Davids    schedule 09.10.2011
comment
Спасибо за ответ. Но иногда это не работает, как ожидалось. Если я добавляю ответ в комментарий в первый раз, он не помещается в ячейку. Он выходит за пределы клетки (большой комментарий). Если я добавлю еще один ответ, то первый ответ будет обрезан, что означает, что он показывает частичный ответ, но второй ответ отображается правильно. Я обновил код. Смотрите мое обновление. Спасибо - person iOSAppDev; 11.10.2011

temparray - это ваш массив, который вы использовали для загрузки ячеек в cellForRowAtIndexPath

(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *str = [temparray objectAtIndex:indexPath.row];    
    If (str. length > 50) {
        return  85;
    }
    else {
        return 60;
    }
}
person user2003328    schedule 23.01.2013