UITextView 布局的正确高度
Posted
技术标签:
【中文标题】UITextView 布局的正确高度【英文标题】:Correct height for UITextView layouts 【发布时间】:2013-12-07 19:30:05 【问题描述】:我在这里四处寻找有关此方面的帮助,但我还没有找到任何可以正常工作的解决方案。 Here 是一个例子,它还没有为我工作。
这是我正在使用的 xib。有一个outterView和稍微偏移的innerView(为了得到左边的粗蓝线。里面有一个UILabel,UITextView,UILabel和UITextView。加上两个UIButton,我可以把它抱在视图的底部。
XIB 图片:xib
挑战在于两个 UITextView 包含动态长度的内容。它们可以增长,然后内部/外部视图也必须增长。以下是我尝试做到这一点的方法,有一些变化,但没有可靠的成功。要么是乱码,要么是重叠,要么是文字,要么是文字上面有按钮,等等。
// viewDidLoad (or in loadView)
-(void)viewDidLoad
[super viewDidLoad];
// set UITextView text
[warmupDesc setText:[workout objectForKey:@"warmup_description"]];
[workoutDesc setText:[workout objectForKey:@"workout_description"]];
// warmup sizeToFit
[self.warmupDesc sizeToFit];
CGSize txtSize = self.warmupDesc.contentSize;
txtSize.height = self.warmupDesc.frame.size.height;
self.warmupDesc.contentSize = txtSize;
// workout sizeToFit
[self.workoutDesc sizeToFit];
CGSize txtSize2 = self.workoutDesc.contentSize;
txtSize2.height = self.workoutDesc.frame.size.height;
self.workoutDesc.contentSize = txtSize2;
// set outview height to be sum of heights of all internal items, plus padding
outterView.frame = CGRectMake(outterView.frame.origin.x, outterView.frame.origin.y, outterView.frame.size.width, warmupDesc.frame.size.height + workoutDesc.frame.size.height + recordBtn.frame.size.height + 60);
// update innerView height to match
innerView.frame = CGRectMake(innerView.frame.origin.x, innerView.frame.origin.y, innerView.frame.size.width, outterView.frame.size.height);
结果大多是这样的。我不确定 UITextView 是否已调整大小(默认为 85px)。底部的应该至少是它的两倍大。并且按钮重叠,显示 outterView 的添加逻辑效果不佳。
关于正确布局的任何提示,或自动调整大小的更好方法?到目前为止,我一直避免使用 UITextviews,有更好的元素吗?
结果图片:simulator
【问题讨论】:
"I'm not sure the UITextView's even resized
" 因为self.workoutDesc.contentSize = txtSize2;
...您正在设置contentSize
,而不是框架。
【参考方案1】:
试试这个:
-(void)viewDidLoad
//...
//warmup sizeToFit
[self.warmupDesc sizeToFit];
CGRect warmUpFrame = self.warmupDesc.frame;
warmUpFrame.size.height = self.warmupDesc.contentSize.height;
self.warmupDesc.frame = warmUpFrame;
//workout sizeToFit
[self.workoutDesc sizeToFit];
CGRect workoutDescFrame = self.workoutDesc.frame;
workoutDescFrame.height = self.workoutDesc.contentSize.height;
self.workoutDesc.frame = workoutDescFrame;
//...
但现在一切都会下降,下降。
当按钮离开可见视图时,您是否处理过这种情况?
喜欢用UIScrollView
?
【讨论】:
我刚才也试过了,它似乎没有做需要的事情。两个文本视图都从默认的 80 像素更改为 72 像素,第二个需要至少是该大小的 2-3 倍。在这种情况下,第一个可能需要达到 90px,但不需要。 ----尽管按钮和滚动是正确的,但在某些情况下,整个屏幕的视图都需要滚动。【参考方案2】:跟进。我发现下面的 getContentSize 函数获取 UITextView 高度的方法相当有效。似乎它对于小文本来说往往有点短,而对于大文本来说似乎过大,所以我进行了似乎有帮助的调整(+10,* .80)。但这在其他方面效果很好。
self.warmupDesc.frame = CGRectMake(self.warmupDesc.frame.origin.x, self.warmupName.frame.origin.y + self.warmupName.frame.size.height - 7, self.warmupDesc.frame.size.width, ([self getContentSize: warmupDesc].height + 10) * .80);
-(CGSize) getContentSize:(UITextView*) myTextView
CGRect frame = [myTextView.text boundingRectWithSize:CGSizeMake(myTextView.frame.size.width, FLT_MAX)
options:(NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading)
attributes:@NSFontAttributeName:[UIFont systemFontOfSize:15]
context:nil];
return frame.size;
【讨论】:
以上是关于UITextView 布局的正确高度的主要内容,如果未能解决你的问题,请参考以下文章
使用自动布局的 UITableView 中的动态 UITextView 高度?
使用自动布局的 UITextView 动态高度 - 每个新行的文本截断顶行
UIScrollView 内的自动布局 UITextView 大小不正确