我使用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),我会得到这个(标签覆盖所有单元格,通常不起作用)
如果优先级大于500,则单元格中不显示任何内容。
答案 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;
}