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 大小不正确

如果要换行的文本中有长字符串,则 sizeWithFont 不会为 UITextView 提供正确的高度

有没有办法可靠地计算 UITextView 的高度?

UIScrollView 中的 UITextView 使用自动布局