0

我有包含帖子详细信息和表格视图的视图控制器。表格单元格是自定义的。我在单元格上放置了 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;
}
4

3 回答 3

2

我没有看到您在哪里实现了 tableview 委托方法:

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

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

于 2011-10-09T16:22:20.087 回答
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,但是当你玩它的时候你应该很容易看到它。

于 2011-10-09T18:20:50.967 回答
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;
    }
}
于 2013-01-23T09:32:49.913 回答