gpt4 book ai didi

ios - 如何根据文本计算TextView高度

转载 作者:可可西里 更新时间:2023-11-01 03:26:37 24 4
gpt4 key购买 nike

我使用下面的代码来计算文本的高度,然后为 UILabelUITextView 设置这个高度

CGSize targetSize = CGSizeMake(300, CGFLOAT_MAX);
NSString *message = @"The Internet connection appears to be offline.";

NSStringDrawingContext *context = [[NSStringDrawingContext alloc] init];
CGSize boundingBox = [message boundingRectWithSize:targetSize
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName:FontOpenSanWithSize(14)}
context:context].size;

CGSize size = CGSizeMake(ceil(boundingBox.width), ceil(boundingBox.height));
// it will return size:width = 299 and size height 20
// => if I use this height and set for UILabel, it can display full content
// => if I use this height and set for UITextView, it can not display full content

它对于 UILabel 来说是完美的,但对于 UITextView 有时它会计算错误。
我认为问题的发生是因为 UITextView 的填充(左,右)比 UILabel 大。
那么我如何计算在 UITextView 中显示的正确文本大小。任何帮助或建议将不胜感激。

喜欢下面的描述图片
具有相同的大小 (300)、相同的字体、相同的文本,但 UITextView 显示在 2 行中,而 UILabel 显示在 1 行中。而我计算高度的代码返回 20,它不足以显示在 2 行中,所以 UITextView 无法显示完整内容

之所以需要根据文本计算 UITextView 的高度,是因为我的 UITextView 在弹出窗口中。弹出高度将取决于 TextView 高度

enter image description here

最佳答案

有两件事你可以尝试:

  1. 设置 textView.textContainerInset = UIEdgeInsetsZero
  2. 设置 textView.textContainer.lineFragmentPadding = 0

通过这些操作,您可以去掉 textView 中的所有填充,并且当它的宽度与标签的宽度匹配时,高度也相同。

这是一个示例代码,您可以将其放在一个空的 viewController 中并自行测试:

- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];

NSString *text = @"The internet connection appears to be offline.";
CGFloat width = 100.f;

UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(20, 20, width, 300)];
textView.font = [UIFont fontWithName:@"AvenirNext-Regular" size:12.f];
textView.text = text;
[self.view addSubview:textView];

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(20 + width, 20, width, 300)];
label.numberOfLines = 0;
label.font = [UIFont fontWithName:@"AvenirNext-Regular" size:12.f];
label.text = text;
[self.view addSubview:label];

// Getting rid of textView's padding
textView.textContainerInset = UIEdgeInsetsZero;
textView.textContainer.lineFragmentPadding = 0;

// Setting height of textView to its contentSize.height
CGRect textViewFrame = textView.frame;
textViewFrame.size = textView.contentSize;
textView.frame = textViewFrame;

// Setting height of label accorting to it contents and width
CGRect labelFrame = label.frame;
labelFrame.size = [label sizeThatFits:CGSizeMake(width, HUGE_VALF)];
labelFrame.size.width = width;
label.frame = labelFrame;

NSLog(@"Label bounds: %@", NSStringFromCGRect(label.bounds));
NSLog(@"TextView bounds: %@", NSStringFromCGRect(textView.bounds));

// Visualizing final effect with borders
textView.layer.borderColor = [UIColor redColor].CGColor;
textView.layer.borderWidth = 1.f;
label.layer.borderColor = [UIColor greenColor].CGColor;
label.layer.borderWidth = 1.f;
}

控制台输出:

2016-09-01 14:29:06.118 stack39268477[943:243243] Label bounds: {{0, 0}, {100, 66}}
2016-09-01 14:29:06.119 stack39268477[943:243243] TextView bounds: {{0, 0}, {100, 66}}

关于ios - 如何根据文本计算TextView高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39268477/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com