UITableViewCell没有使用UILabel调整大小

时间:2015-02-18 13:32:19

标签: ios objective-c iphone xcode uitableview

我使用parse存储用户注释,并在UITableViewController中显示这些注释。我试图使UITableViewCell动态,因此单元格随UILabel的大小而变化。我的结果很奇怪。

我的评论表ViewViewController.m

    #import "CommentsTableViewController.h"

#import <Parse/Parse.h>

#import "AddCommentViewController.h"

#import "CustomTableViewCell.h"



@interface CommentsTableViewController ()



@property (strong, nonatomic) CustomTableViewCell *customCell;



@end

@implementation CommentsTableViewController



-(void)viewDidLoad

{

    [self getWallImages];

}



-(void)viewDidAppear:(BOOL)animated

{

    [self getWallImages];

    [self.tableView reloadData];

}



-(void) viewWillAppear: (BOOL) animated

{

    [self getWallImages];

    [self.tableView reloadData];

}



- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

{

    return self.commentsArray.count;

}



- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

    CustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CustomCell"];



    PFObject *commentObject = [self.commentsArray objectAtIndex:indexPath.row];

    cell.userLabel.text = [commentObject objectForKey:@"user"];

    cell.commentLabel.text = [commentObject objectForKey:@"comment”];



        return cell;

}



- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section

{

    return self.titleNameString;

}



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

{

     if(!self.customCell) {

    self.customCell = [tableView dequeueReusableCellWithIdentifier:@"CustomCell"];

    }

    PFObject *commentObject = [self.commentsArray objectAtIndex:indexPath.row];



    self.customCell.userLabel.text = [commentObject objectForKey:@"user"];

    self.customCell.commentLabel.text = [commentObject objectForKey:@"comment"];



    self.customCell.commentLabel.preferredMaxLayoutWidth = self.tableView.bounds.size.width;



    [self.customCell layoutIfNeeded];





    CGFloat height = [self.customCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;



    return height;

 }

-(void)getWallImages

{

    PFQuery *query = [PFQuery queryWithClassName:[NSString stringWithFormat:@"%@",self.titleNameString]];

    [query orderByDescending:@"createdAt"];

    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {



        if (!error) {



            self.commentsArray = nil;



            self.commentsArray = [[NSArray alloc] initWithArray:objects];



            [self.tableView reloadData];



        } else {



            NSString *errorString = [[error userInfo] objectForKey:@"error"];



            UIAlertView *errorAlertView = [[UIAlertView alloc] initWithTitle:@"Error" message:errorString delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];



            [errorAlertView show];

        }

    }];

}

不确定它是否与故事板中我的UITableViewCell的设置或者我的UILabel约束有关....

如果我将commentLabel的Priority约束设置为小于500(例如250),我会得到这个(标签覆盖所有单元格,通常不起作用)

screen cap UITableView

如果优先级大于500,则单元格中不显示任何内容。

constraints screen cap

2 个答案:

答案 0 :(得分:1)

好吧,我有一个类似的要求,我构建它的方式是我将标签约束设置为superview的所有边缘,即contentView,但没有指定宽度或高度约束。

然后我只计算了单元格对给定文本所需的高度,并将heightForRowAtIndexPath设置为该计算高度。

因此,当细胞扩张时,它也会拉动标签以适应其高度。

这是计算其高度的函数片段。

   -(CGSize)heightforCellForText:(NSString*)text font:(UIFont*)font width:(CGFloat)width
{
    UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, width, CGFLOAT_MAX)];
    label.numberOfLines = 0;
    label.lineBreakMode = NSLineBreakByWordWrapping;
    label.font = font;
    label.text = text;
    [label sizeToFit];
    return label.frame.size;
}

我使这个方法更加动态,以适应字体的变化。所以只需将标签字体作为参数传递即可。

干杯!

答案 1 :(得分:0)

您需要实施:

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

    //CALCULATE HEIGHT HERE

}

这是委托方法之一,应该解决问题。您可以通过查看UILabel中的字符数来计算高度。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    //get the cell
    CustomTableViewCell *cell = (CustomTableViewCell *)[self.tableView cellForRowAtIndexPath:indexPath];

//say we know that there are 15 characters  per line

int chars = cell.commentLabel.text.length;
int lines = chars/15;

//say our default cell height is 50, maybe we want 5 pts per line

float height = 50 +5*lines;

return height;





}