使用xcode 4在iphone中动态表视图单元格高度

时间:2011-10-09 16:15:42

标签: iphone xcode4 tableviewcell

我有视图控制器,其中包含帖子详细信息和表视图。表格单元格是自定义的。我放了uilabel,uibutton& uitextview on cell。此表格单元格包含注释和回复帖子。因此表格单元格高度是动态的。如果评论有回复,则正确显示单元格的高度。但是如果评论没有回复,那么错误地计算表格单元格高度。我想要桌子和桌子表视图高度应根据单元格的内容动态显示。我的视图控制器包含另一个被称为“内容视图”的视图,我在其中放置了帖子详细信息&我的表视图。以下是我的图片,可以让您了解我的观点。 下图是仅了解视图。

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 个答案:

答案 0 :(得分:2)

我看不到你在哪里实现了tableview委托方法:

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

这是我想要测试你的内容并提供单元格大小的地方。

答案 1 :(得分:1)

我认为您的计算不正确。如果我正确地遵循它,我猜想只有一些回复,它恰好接近正确的大小。太多的评论,它会太小,没有评论你的单元格高度会超大。 这是因为您基本上将整体行高计算为:

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次迭代中均匀。更多,它将开始太小。

我认为如果你在135.0初始化replyHeight并将replyHeight的增量更改为80而不是50.0,则计算应该更接近。因为在这个浏览器中很难遵循,所以我可能会离开。 然后从返回值中删除两个变量TABLE_CONTENT_MARGIN和TABLE_CELL_HEIGHT。 返回值135 + commentHeight +(80 x replyArray.count)应该是正确的。您不需要遍历注释,因为您没有将字符串用于我能看到的任何内容。你可能也需要那个T_C_M,但是你玩它时应该很容易看到它。

答案 2 :(得分:0)

temparray是您用于在cellForRowAtIndexPath中加载单元格的数组

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