如何使节标题中的 UITextView 将其高度调整为其内容
Posted
技术标签:
【中文标题】如何使节标题中的 UITextView 将其高度调整为其内容【英文标题】:How to make UITextView in section header adjust its height to its content 【发布时间】:2014-02-13 22:31:56 【问题描述】:我无法让它工作。我在当前视图控制器上使用自动布局。我有一个具有节标题的 UITableView ,每个节标题都有 UITextView ,其文本的长度因节而异。我不能让它自动放大它的高度以适应内容,所以不需要滚动(它的内容是属性文本)
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
//UITextView *tv = [[UITextView alloc] init];
//tv.editable = NO;
//tv.attributedText = [self millionaireResults][section][@"header"];
//return tv;
return [self millionaireResults][section][@"headerview"]; //this is a uitextview
// this did not workeither
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
UITextView *tv = [self millionaireResults][section][@"headerview"];
return tv.frame.size.height;
如何解决这个问题?
我根据下面 Michael 的建议更新了代码
【问题讨论】:
【参考方案1】:让你的“UITextView *tv
”对象成为一个属性,然后你可以做这样的事情(假设你的表格视图只有一个部分):
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
return (self.tv.frame.size.height);
如果您有更多部分(您确实有),您应该将该属性设置为 UITextView 对象的 NSArray。
这也意味着您需要设置“tv
”对象的内容在“viewForHeaderInSection:
”被调用之前。
【讨论】:
成功了!谢谢!你能告诉我为什么它有效吗?唯一的区别是,我没有在 viewForHeaderInSection: ... 方法中创建 UITextView 对象,而是按照您的建议将它们创建为 NSArray 属性。在该委托方法中创建有什么问题?如果您知道,我将不胜感激。 因为heightForHeaderInSection
早在viewForHeaderInSection
被调用之前就被调用了。在实际绘制单个单元格和部分标题之前,ios 需要知道表格及其内容的高度。
讨厌重新打开它,但上面的代码在我的代码(我的愚蠢)中不起作用(我有一个返回 200;),它通过返回该大小使其适合 UITextView。在上面的代码中返回 self.tv.frame.size.height 返回 0.000000 (请不要生气,但我必须取消选中接受的答案,直到我让它工作)
记得我告诉过你在调用“heightForHeaderInSection
”之前实际填充文本视图条目数组,对吧?
如果您使用“UITextView *tv = [[UITextView alloc] init]];
”创建 UITextView,则没有设置帧大小。在将其保存到数组中之前,您需要为其指定一个帧大小。【参考方案2】:
这是对我有用的答案
-
在创建 UITextView 时,必须设置 scrollEnabled
为假。
您的 UITextView 必须指定覆盖水平空间的宽度,否则自动大小计算将关闭(有时它有时不是,我认为取决于 wordbreak 或其他东西,但它不一致!)并且只有在您旋转时才会自行修复强制重绘的设备
在heightForHeaderInSection方法中,你必须得到
sizeThatFits 并将其高度作为文本视图的高度返回
这里是高度计算(我在这个网站上找到了这个http://www.raywenderlich.com/50151/text-kit-tutorial)
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
UITextView *tv1 = (UITextView *)[self millionaireResults][section][@"headerview"];
// sizethatfits calculates the perfect size for this UITextView
// if you gave your UITextView full width
CGSize goodsize = [tv1 sizeThatFits:tv1.frame.size];
return goodsize.height+4; // here 4 is not necessary, i just put it as an offset
这是创建这些 UITextView 对象的代码
for (int i = 0; i < [milarr count]; i++)
UITextView *tv = [[UITextView alloc] init];
tv.editable = NO;
tv.attributedText = milarr[i];
// labelTopTitle and this table in question have same width in an autoLayouted view
// so i am giving width of labelTopTitle to let UITextView cover full available
// horizontal space
tv.frame = CGRectMake(0, 0, self.labelTopTitle.frame.size.width,FLT_MAX);
//tv.backgroundColor = [UIColor grayColor];
//tv.textContainerInset = UIEdgeInsetsZero;
tv.scrollEnabled = NO;
[results addObject:@@"headerview": tv,
@"rows":@[...]
];
【讨论】:
以上是关于如何使节标题中的 UITextView 将其高度调整为其内容的主要内容,如果未能解决你的问题,请参考以下文章
我将如何(以编程方式)将 UITextView 的高度设置为其在 Swift 中的内容大小?
动态 UIScrollView 中的动态 UITextView - iOS
iOS Swift - 动态增加 UITextView 和父 UIView 的高度