我使用UITableViewController
代替detailView来显示一个实体细节。我在viewDidLoad
方法中填充了PFQuery中的一行数据。我有一个单元格,我使用标签,我想根据NSString
大小更改大小。我检查了很多答案,但都与indexPath
有关,这是动态的,我有静态单元格。 My label
显示完整的字符串,但我的单元格已修复。如何更改单元格的高度?请帮我纠正这个问题。
这是我的代码:
- (void)viewDidLoad
{
[super viewDidLoad];
PFQuery *query = [PFQuery queryWithClassName:@"Entities"];
[query whereKey:@"name" equalTo:entityName];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if (!error) {
PFFile *thumbnail = [objects[0] objectForKey:@"image"];
detailsImageView.image = [UIImage imageNamed:@"loader.gif"];
detailsImageView.file = thumbnail;
[detailsImageView loadInBackground];
detailLabel.numberOfLines = 0; // this label need dynamic height and its cell
detailLabel.text = [objects[0] objectForKey:@"descriptionLarge"];
[detailLabel sizeToFit];
} else {
NSString *errorString = [[error userInfo] objectForKey:@"error"];
NSLog(@"Error: %@", errorString);
}
}];
}
我试图通过选择单个单元格来执行以下操作,但它给了我UITableView错误,因为我没有定义tableView,如何定义或者如果您有任何其他好的解决方案请告诉我。
static NSString *simpleTableIdentifier = @"DetailsDesecriptionCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
我对批评编码质量持开放态度,因此您的反馈对我有价值。
答案 0 :(得分:16)
如果是IOS 8 OR 9,则有一个简单的解决方法。
tableView.estimatedRowHeight = 68.0 tableView.rowHeight = UITableViewAutomaticDimension
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { return UITableViewAutomaticDimension }
答案 1 :(得分:3)
如果您使用的是自动布局。将顶部,左侧和右侧约束添加到您的标签中。
然后在heightForRowAtIndexPath
创建您的单元格
static NSString *simpleTableIdentifier = @"DetailsDesecriptionCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
在设置值
后,将值设置为标签并计算标签的大小 [cell layoutIfNeeded];
return cell.label.frame.origin.y+cell.label.frame.size.height;
这将为您提供标签的确切高度,并且您的单元格高度将相同
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *simpleTableIdentifier = @"DetailsDesecriptionCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
cell.titleLabel.text=@"YOUR TEXT";
[cell layoutIfNeeded];
return cell.titleLabel.frame.origin.y+cell.titleLabel.frame.size.height;
}
答案 2 :(得分:1)
以下是我的工作方式。
// this will set height of the row
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
String *yourLongString = "Long text here";
UILabel *mLabel = [[UILabel alloc] initWithFrame:CGRectMake(0,0,320,30)];
your size will change here
mLabel.hidden = YES;
mLabel.text = yourLongString;
[mLabel sizeToFit];
^^^^^^^^ this is very important
return mLabel.frame.size.height;
}
现在在cellForRowAtIndexPath
根据单元格的高度调整实际标签的高度。
如果你不清楚,请告诉我。
答案 3 :(得分:1)
我一直在尝试从很多天来实现这一目标,但事实并非如此。我尝试了Fahim的回答并得到了线索,我从其他不同的答案得到了并且能够完成它。 我在代码中添加了以下函数来获取标签的确切大小
-(CGFloat)getLabelHeightForText:(NSString *)text andWidth:(CGFloat)labelWidth
{
CGSize maximumSize = CGSizeMake(labelWidth, 10000);
NSLog(@"crossing getLabelheightForText");
//provide appropriate font and font size
CGSize labelHeighSize = [text sizeWithFont: [UIFont fontWithName:@"Trebuchet MS" size:17.0f]
constrainedToSize:maximumSize
lineBreakMode:NSLineBreakByTruncatingTail];
return labelHeighSize.height;
}
比我添加了indexPath,返回的所有单元格大小只显示一个单元格大小。
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
switch (indexPath.section)
{
case 0:
{
if (indexPath.row == 0) // category name size
return 44.0;
if (indexPath.row == 1) // image size
return 204;
}
default:
return 44.0
}
}
但在此之后我获得了完美的标签大小,但仍然有更多的事要做,因为我使用PFQuery和tableView indexPath首先运行,这就是为什么它无法更新我的表,我仍然无法调整单元格大小。这里是重新加载我的tableView并解决我的问题的魔术线
[self.tableView reloadData];
虽然问题很简单,但它有很多东西,所以我把它作为回复来帮助其他人。