我有一个UITableview
,有多个可重复使用的TableViewCells。
在一个单元格中,我有一个UITextView
,它会自行调整大小以适应其内容。现在我“只是”必须调整TableViewCell的contentView
,所以我可以阅读while文本。我已经尝试过了:
cell2.contentView.bounds.size.height = cell2.discriptionTextView.bounds.size.height;
或者:
cell2.contentView.frame = CGRectMake(0, cell2.discriptionTextView.bounds.origin.y,
cell2.discriptionTextView.bounds.size.width,
cell2.discriptionTextView.bounds.size.height);
在方法中:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath
*)indexPath {}
但它不起作用。
有谁知道怎么做?
新代码:
@implementation AppDetail
CGFloat height;
…
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{…
cell2.TextView.text = self.text;
[cell2.TextView sizeToFit];
height = CGRectGetHeight(cell2.TextView.bounds);
…
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row == 0) {
return 143;
}
if (indexPath.row == 1) {
return height;
}
return 0;
}
答案 0 :(得分:18)
您只能在tableView:heightForRowAtIndexPath:
委托方法中调整UITableViewCell的大小。
当加载tableView时,必须估计为每行调用该方法时文本的大小。
这就是我为解决问题所做的工作。
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString * yourText = self.myArrayWithTextInIt[indexPath.row]; // or however you are getting the text
return additionalSpaceNeeded + [self heightForText:yourText];
}
-(CGFloat)heightForText:(NSString *)text
{
NSInteger MAX_HEIGHT = 2000;
UITextView * textView = [[UITextView alloc] initWithFrame: CGRectMake(0, 0, WIDTH_OF_TEXTVIEW, MAX_HEIGHT)];
textView.text = text;
textView.font = // your font
[textView sizeToFit];
return textView.frame.size.height;
}
修改强>
虽然我使用了这个解决方案一段时间,但我发现了一个更优化的解决方案,我建议使用它,因为它不需要分配整个textView才能工作,并且可以处理大于2000的文本。
-(CGFloat)heightForTextViewRectWithWidth:(CGFloat)width andText:(NSString *)text
{
UIFont * font = [UIFont systemFontOfSize:12.0f];
// this returns us the size of the text for a rect but assumes 0, 0 origin
CGSize size = [text sizeWithAttributes:@{NSFontAttributeName: font}];
// so we calculate the area
CGFloat area = size.height * size.width;
CGFloat buffer = whateverExtraBufferYouNeed.0f;
// and then return the new height which is the area divided by the width
// Basically area = h * w
// area / width = h
// for w we use the width of the actual text view
return floor(area/width) + buffer;
}
答案 1 :(得分:16)
正如@Rob Norback所说,有一种叫做UITableViewAutomaticDimension
的东西。
对于Swift,动态调整UITableViewCell内容大小的最简单方法就是添加它。
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
答案 2 :(得分:14)
这是iOS 7+的更新版本,更清晰(无需额外方法)
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
UIFont * font = [UIFont systemFontOfSize:15.0f];
NSString *text = [getYourTextArray objectAtIndex:indexPath.row];
CGFloat height = [text boundingRectWithSize:CGSizeMake(self.tableView.frame.size.width, maxHeight) options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) attributes:@{NSFontAttributeName: font} context:nil].size.height;
return height + additionalHeightBuffer;
}
答案 3 :(得分:8)
您需要实施heightForRowAtIndexPath
。
假设要在textView中显示的数据存储在NSArray中。
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
CGFloat cellheight = 30; //assuming that your TextView's origin.y is 30 and TextView is the last UI element in your cell
NSString *text = (NSString *)[textArray objectAtIndex:indexpath.row];
UIFont *font = [UIFont systemFontOfSize:14];// The font should be the same as that of your textView
CGSize constraintSize = CGSizeMake(maxWidth, CGFLOAT_MAX);// maxWidth = max width for the textView
CGSize size = [text sizeWithFont:font constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];
cellHeight += size.height; //you can also add a cell padding if you want some space below textView
}
答案 4 :(得分:4)
var date1 = new Date("Mon Oct 24 2016 04:22:12 GMT+0530 (IST)");
var date2 = new Date("Mon Oct 24 2016 10:22:12 GMT+0530 (IST)");
var hours = Math.floor(Math.abs(date1 - date2) / 36e5);
console.log(hours);
设置
textView.scrollEnabled
如果最后,您的代码不起作用,请改用
table.rowHeight = UITableViewAutomaticDimension;
tableView.estimatedRowHeight = 44;
像这样实施- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return UITableViewAutomaticDimension;
}
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 44;
}
:
UITextViewDelegate
答案 5 :(得分:3)
这个帖子已经有一段时间了,但是在iOS 8中引入了UITableViewAutomaticDimension
。您必须设置从单元格的顶部到底部的约束,如滚动视图,以使其工作。但在此之后,只需将以下代码添加到viewDidLoad()
:
tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 122.0
确保你的估计身高尽可能接近真实的东西,否则你会得到一些错误的滚动。
答案 6 :(得分:2)
使用UITableViewAutomaticDimension将这两个方法添加到ViewController应该可以解决问题。当在具有可变长度文本的UITableViewCell中嵌入UITextView时,它对我有用。
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return UITableViewAutomaticDimension;
}
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return UITableViewAutomaticDimension;
}
答案 7 :(得分:1)
如果在UITableViewCell中使用UILabel子视图,我只需设置标签的约束即可完成标签的自动调整大小(使用storyboard,Xcode 8.3.2)。
这是有效的,因为显然标签和单元格的默认行为是sizeToFit。同样适用于UITextView。