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

У меня есть контроллер представления, который содержит подробности сообщения и представление таблицы. Ячейки таблицы являются пользовательскими. Я поместил uilabel, uibutton & uitextview в камеру. Эта ячейка таблицы содержит комментарии и ответы на пост. Таким образом, высота ячейки таблицы является динамической. Если комментарий имеет ответы, то высота ячейки отображается правильно. Но если комментарий не имеет ответа, то высота ячейки таблицы вычисляется неправильно. Я хочу, чтобы высота ячейки таблицы и таблицы была динамической в ​​соответствии с содержимым ячейки. Мой контроллер представления содержит другое представление, известное как «представление содержимого», в которое я поместил подробности публикации и представление моей таблицы. Ниже мое изображение, которое даст вам представление о моем взгляде. На рисунке ниже показано только представление.

enter image description here

Вот мой код

#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;
}

Ответы [ 3 ]

2 голосов
/ 09 октября 2011

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

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

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

1 голос
/ 09 октября 2011

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

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

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

В вашем cellForRowAtIndexPath кажется, что вам понадобится только 135.0 + высота комментария для одного комментария. Поэтому, если у вас нет ответов, у вас будет строка, почти вдвое превышающая необходимый размер. Причина, по которой это будет выглядеть правильно с несколькими ответами, заключается в том, что вы используете 80.0 для каждого ответа, но вы добавляете только 50.0 к высоте строки. Каждый раз он становится на 30 пунктов ближе, а затем примерно за 4 или 5 итераций выровняется. Больше, и оно станет слишком маленьким.

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

0 голосов
/ 23 января 2013

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

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