如何根据内容调整 UITextView 的大小?

Posted

技术标签:

【中文标题】如何根据内容调整 UITextView 的大小?【英文标题】:How do I size a UITextView to its content? 【发布时间】:2008-09-08 19:21:19 【问题描述】:

有没有调整UITextView 的大小以符合其内容的好方法?比如说我有一个包含一行文本的UITextView

"Hello world"

然后我添加另一行文本:

"Goodbye world"

在 Cocoa Touch 中是否有一个很好的方法来获取 rect,它将保存文本视图中的所有行,以便我可以相应地调整父视图?

作为另一个示例,查看日历应用程序中事件的注释字段 - 请注意单元格(以及它包含的 UITextView)如何扩展以容纳注释字符串中的所有文本行。

【问题讨论】:

请考虑更新正确答案,因为接受的答案会导致不必要的计算,现在有一个 contentSize 属性来解决这个问题。 为什么没有关于如何以非动态方式执行此操作的问题?我什至不知道如何静态地做到这一点。并且提供的解决方案似乎没有覆盖情节提要中的“约束”。 【参考方案1】:

这适用于 ios 6.1 和 iOS 7:

- (void)textViewDidChange:(UITextView *)textView

    CGFloat fixedWidth = textView.frame.size.width;
    CGSize newSize = [textView sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)];
    CGRect newFrame = textView.frame;
    newFrame.size = CGSizeMake(fmaxf(newSize.width, fixedWidth), newSize.height);
    textView.frame = newFrame;

或在 Swift 中(适用于 iOS 11 中的 Swift 4.1)

let fixedWidth = textView.frame.size.width
let newSize = textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.greatestFiniteMagnitude))
textView.frame.size = CGSize(width: max(newSize.width, fixedWidth), height: newSize.height)

如果您想要支持 iOS 6.1,那么您还应该:

textview.scrollEnabled = NO;

【讨论】:

在 iOS 7 上测试,将 UITextView 调整为 UITableViewCell。工作真的很棒。这是最终对我有用的唯一答案。谢谢! 我需要textview.scrollEnabled = NO; 来防止文本被截断,即使在 iOS 7 中也是如此。 我建议使用CGFLOAT_MAX 宏而不是MAXFLOAT。适用于 32/64 位平台。 在下一行输入前波动不大的加这个` NSRange bottom = NSMakeRange(textView.text.length -1, 1); [textView scrollRangeToVisible:bottom];` 为什么在 Swift 版本中有两个单独的 sizeThatFits(...) 调用?第一行是干什么用的?【参考方案2】:

这不再适用于 iOS 7 或更高版本

实际上有一种非常简单的方法可以将UITextView 调整为正确的内容高度。可以使用UITextView contentSize 来完成。

CGRect frame = _textView.frame;
frame.size.height = _textView.contentSize.height;
_textView.frame = frame;

需要注意的是,正确的contentSize 仅在UITextView 使用addSubview 添加到视图之后 可用。在此之前它等于frame.size

如果启用自动布局,这将不起作用。对于自动布局,一般的做法是使用sizeThatFits 方法并在高度约束上更新constant 值。

CGSize sizeThatShouldFitTheContent = [_textView sizeThatFits:_textView.frame.size];
heightConstraint.constant = sizeThatShouldFitTheContent.height;

heightConstraint 是一个布局约束,您通常通过 IBOutlet 将属性链接到情节提要中创建的高度约束来设置。


只是为了补充这个惊人的答案,2014,如果你:

[self.textView sizeToFit];

只有 iPhone6+ 的行为有所不同:

只有 6+(不是 5s 或 6)它确实向 UITextView 添加了“一个空白行”。 “RL 解决方案”完美地解决了这个问题:

CGRect _f = self.mainPostText.frame;
_f.size.height = self.mainPostText.contentSize.height;
self.mainPostText.frame = _f;

它修复了 6+ 的“额外行”问题。

【讨论】:

你拯救了我的一天。我正在为忘记这一点的 selfCalculating 类函数扩展而苦苦挣扎。谢谢。 啊哈!我正在设置文本视图高度,然后调整包含视图的高度。显然,当我这样做时,正在调整文本视图高度。首先设置包含视图的高度会使事情按预期工作(或者,更好,希望)。 使用 [_textView sizeToFit] 刷新 contentSize 属性,无需事先将其添加到 scrollView。 如果使用自动布局,请在 superview 上调用 layoutIfNeeded。然后就可以从contentSize抓取高度了。 这是关于调整外部容器的大小。这种行为在 iOS 7 中发生了变化。我在链接的问题中显示了在哪里添加 sizeToFit 和 layoutIfNeeded。【参考方案3】:

更新

您需要做的关键是在 UITextView 中关闭滚动。

myTextView.scrollEnabled = @NO

原答案

为了在UITableViewCell 中动态调整UITextView 的大小,我发现以下组合适用于Xcode 6 和iOS 8 SDK:

UITextView 添加到UITableViewCell 并将其约束到两侧

UITextViewscrollEnabled 属性设置为NO。启用滚动后,UITextView 的框架与其内容大小无关,但禁用滚动时,两者之间存在关系。

如果您的表格使用原始默认行高 44,那么它将自动计算行高,但如果您将默认行高更改为其他值,您可能需要在 @ 中手动开启自动计算行高987654330@:

 tableView.estimatedRowHeight = 150;
 tableView.rowHeight = UITableViewAutomaticDimension;

对于只读动态调整UITextViews 的大小,就是这样。如果您允许用户编辑您的 UITextView 中的文本,您还需要:

实现UITextViewDelegate协议的textViewDidChange:方法,并告诉tableView在每次编辑文本时重新绘制自己:

 - (void)textViewDidChange:(UITextView *)textView;
 
     [tableView beginUpdates];
     [tableView endUpdates];
 

别忘了在某处设置UITextView 委托,在StoryboardtableView:cellForRowAtIndexPath:

【讨论】:

对我来说最好的答案。完美运行,iOS 5 中添加了 UITableViewAutomaticDimension,因此它向后兼容。 不太适合我。 textViewDidChange 方法会导致我的表格视图在我每次输入字符时弹跳。我建议不要在 tableView 中使用该方法:cellForRowAtIndexPath 方法,对于上面带有 textview 的行,如果您处于只读模式,则将 .scrollEnabled 设置为 NO,并且如果您处于编辑视图集中滚动启用为 YES。这样,当仅显示时,它将始终显示全文,并且在编辑时将从全文开始,并且当您添加更多文本时,将保持相同的大小,而较早的文本会从顶部滚动 此外,我在文本视图中添加了 >= 高度约束,因为空文本字段没有高度,无法点击开始编辑。 优秀的解决方案。对我来说,tableView.rowHeight = UITableViewAutomaticDimension 是不必要的。 再次感谢布雷特·唐纳德!我忘了怎么做,一年多后又找到了你的答案?。【参考方案4】:

使用代码和情节提要的非常简单的解决方案。

按代码

textView.scrollEnabled = false

按故事板

取消选中启用滚动

除此之外不需要做任何事情。

【讨论】:

这个答案是正确的。在 StoryBoard 中,您拥有 TextView AutoSize,就像 UILabel 一样。我们需要做的就是设置 scrollEnabled=false。 基本上,这是正确的:如果您使用 Autolayout 约束并关闭滚动,则一切正常。 非常感谢。就是这么简单,只要在故事板或代码中禁用滚动,它就会像 UILabel 的第 0 行。 @Mansuu.... 这不是一个有保证的解决方案,因为您可以采取一些措施来覆盖内在内容大小,并且如果您在视图布局后更改文本除非您也进行设置,否则不会更新。但是,对于在文本字段上设置 numberOfLines = 0 来说,这些事情仍然成立。如果这不起作用,您可能有其他约束会隐式设置高度。 @iOS 如果要添加高度约束,则将约束优先级降低,否则将不起作用。【参考方案5】:

斯威夫特:

textView.sizeToFit()

【讨论】:

另外,我发现我需要将滚动启用设置为 false 才能工作。 textView.scrollEnabled = false 你应该记得在 textView.sizeToFit() 之后调用 textView.layoutIfNeeded() @tmarkiewicz 当文本适合您设备的屏幕时它可以工作,但是当您的文本大于屏幕上的空间时就会出现问题。您将无法滚动它以查看其余文本。 这就是答案!!!不需要更复杂的解决方案!!! @FranciscoRomero 为什么不将文本视图放在表格单元格或集合视图单元格中,那么您可以随时滚动表格或集合视图....【参考方案6】:

根据我的(有限的)经验,

- (CGSize)sizeWithFont:(UIFont *)font forWidth:(CGFloat)width lineBreakMode:(UILineBreakMode)lineBreakMode

不尊重换行符,因此您可以得到比实际需要的更短的CGSize

- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size

似乎确实尊重换行符。

此外,文本实际上并未呈现在 UITextView 的顶部。在我的代码中,我将UITextView 的新高度设置为比sizeOfFont 方法返回的高度大24 像素。

【讨论】:

获得的大小就像在 UILabel 上绘制文本一样。如果您将该大小设置为 uitextview 的框架,那么您仍然需要在其中进行一些滚动。【参考方案7】:

在 iOS6 中,您可以在设置文本后立即检查 UITextView 的contentSize 属性。在 iOS7 中,这将不再起作用。如果要在 iOS7 中恢复这种行为,请将以下代码放在 UITextView 的子类中。

- (void)setText:(NSString *)text

    [super setText:text];

    if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) 
        CGRect rect = [self.textContainer.layoutManager usedRectForTextContainer:self.textContainer];
        UIEdgeInsets inset = self.textContainerInset;
        self.contentSize = UIEdgeInsetsInsetRect(rect, inset).size;
    

【讨论】:

在哪里可以了解更多信息?对于 iOS 7 中关于此的看似新的行为,我完全迷失了。 变量CGSize size是什么意思? 我删除了大小,它不应该在那里。【参考方案8】:

我将在页面底部发布正确的解决方案,以防有人勇敢(或绝望)阅读到这一点。

这里是那些不想阅读所有文本的人的 gitHub 存储库:resizableTextView

这适用于 iOs7(我相信它也适用于 iOs8)和自动布局。您不需要幻数,禁用布局和类似的东西。简短而优雅的解决方案。

我认为,所有与约束相关的代码都应该转到updateConstraints 方法。所以,让我们自己创建ResizableTextView

我们在这里遇到的第一个问题是在viewDidLoad 方法之前不知道真实的内容大小。我们可以走很长的路,根据字体大小、换行符等来计算它。但是我们需要强大的解决方案,所以我们会这样做:

CGSize contentSize = [self sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)];

所以现在无论我们身在何处,我们都知道真正的 contentSize:在viewDidLoad 之前或之后。现在在 textView 上添加高度约束(通过故事板或代码,无论如何)。我们将使用 contentSize.height 调整该值:

[self.constraints enumerateObjectsUsingBlock:^(NSLayoutConstraint *constraint, NSUInteger idx, BOOL *stop) 
    if (constraint.firstAttribute == NSLayoutAttributeHeight) 
        constraint.constant = contentSize.height;
        *stop = YES;
    
];

最后要做的就是告诉超类updateConstraints

[super updateConstraints];

现在我们的类看起来像:

ResizableTextView.m

- (void) updateConstraints 
    CGSize contentSize = [self sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)];

    [self.constraints enumerateObjectsUsingBlock:^(NSLayoutConstraint *constraint, NSUInteger idx, BOOL *stop) 
        if (constraint.firstAttribute == NSLayoutAttributeHeight) 
            constraint.constant = contentSize.height;
            *stop = YES;
        
    ];

    [super updateConstraints];

漂亮又干净,对吧?而且您不必在 控制器 中处理该代码!

等一下! 没有动画!

您可以轻松地为更改设置动画以使textView 平滑拉伸。这是一个例子:

    [self.view layoutIfNeeded];
    // do your own text change here.
    self.infoTextView.text = [NSString stringWithFormat:@"%@, %@", self.infoTextView.text, self.infoTextView.text];
    [self.infoTextView setNeedsUpdateConstraints];
    [self.infoTextView updateConstraintsIfNeeded];
    [UIView animateWithDuration:1 delay:0 options:UIViewAnimationOptionLayoutSubviews animations:^
        [self.view layoutIfNeeded];
     completion:nil];

【讨论】:

使用CGFLOAT_MAX,而不是FLT_MAX 我希望我能给你一个以上的投票支持这个很棒的解决方案!【参考方案9】:

你试过[textView sizeThatFits:textView.bounds]吗?

编辑:sizeThatFits 返回大小,但实际上并没有调整组件的大小。我不确定这是否是您想要的,或者 [textView sizeToFit] 是否更符合您的要求。无论哪种情况,我都不知道它是否完全符合您想要的内容,但这是首先要尝试的。

【讨论】:

sizetofit 节省一天【参考方案10】:

另一种方法是使用NSString 方法查找特定字符串将占用的大小:

-(CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size

这将返回适合给定字符串和给定字体的矩形大小。传入具有所需宽度和最大高度的尺寸,然后您可以查看返回的高度以适合文本。有一个版本也可以让您指定换行模式。

然后您可以使用返回的大小来更改视图的大小以适应。

【讨论】:

【参考方案11】:

我们可以通过约束来做到这一点。

    为 UITextView 设置高度约束。

2.为该高度约束创建 IBOutlet。

 @property (weak, nonatomic) IBOutlet NSLayoutConstraint *txtheightconstraints;

3.不要忘记为您的文本视图设置委托。

4.

-(void)textViewDidChange:(UITextView *)textView

    CGFloat fixedWidth = textView.frame.size.width;
    CGSize newSize = [textView sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)];
    CGRect newFrame = textView.frame;
    newFrame.size = CGSizeMake(fmaxf(newSize.width, fixedWidth), newSize.height);
    NSLog(@"this is updating height%@",NSStringFromCGSize(newFrame.size));
    [UIView animateWithDuration:0.2 animations:^
                  _txtheightconstraints.constant=newFrame.size.height;
    ];


然后像这样更新你的约束:)

【讨论】:

这是一个了不起的昵称! 设置常量需要后跟[textView layoutIfNeeded];在动画块中。 (自动布局动画就是这样做的。)【参考方案12】:

如果您没有方便的UITextView(例如,您正在调整表格视图单元格的大小),则必须通过测量字符串来计算大小,然后计算每个字符串的 8 pt 填充UITextView 的一侧。例如,如果您知道文本视图所需的宽度并想计算出相应的高度:

NSString * string = ...;
CGFloat textViewWidth = ...;
UIFont * font = ...;

CGSize size = CGSizeMake(textViewWidth - 8 - 8, 100000);
size.height = [string sizeWithFont:font constrainedToSize:size].height + 8 + 8;

这里,每个 8 代表四个填充边缘之一,而 100000 只是作为一个非常大的最大尺寸。

在实践中,您可能希望在高度上添加一个额外的font.leading;这会在您的文本下方添加一个空行,如果文本视图正下方有视觉上沉重的控件,这可能会更好看。

【讨论】:

iOS 8.1 完美结果 填充是我的关键【参考方案13】:

从 iOS 8 开始,可以使用 UITableView 的自动布局功能来自动调整 UITextView 的大小,而无需任何自定义代码。我在github 中放了一个项目来演示这一点,但这里是关键:

    UITextView 必须禁用滚动,您可以通过编程方式或通过界面生成器执行此操作。如果启用滚动,它将不会调整大小,因为滚动可让您查看更大的内容。 在 UITableViewController 的 viewDidLoad 中,您必须为estimatedRowHeight 设置一个值,然后将rowHeight 设置为UITableViewAutomaticDimension

- (void)viewDidLoad 
    [super viewDidLoad];
    self.tableView.estimatedRowHeight = self.tableView.rowHeight;
    self.tableView.rowHeight = UITableViewAutomaticDimension;

    项目部署目标必须是 iOS 8 或更高版本。

【讨论】:

不鼓励这种答案。您应该在此处发布相关代码。【参考方案14】:

结合迈克麦克马斯特的回答,您可能想要执行以下操作:

[myTextView setDelegate: self];

...

- (void)textViewDidChange:(UITextView *)textView 
  if (myTextView == textView) 
     // it changed.  Do resizing here.
  

【讨论】:

【参考方案15】:

我找到了一种方法,可以根据其中的文本调整文本字段的高度,并根据文本字段的高度在其下方排列一个标签!这是代码。

UITextView *_textView = [[UITextView alloc] initWithFrame:CGRectMake(10, 10, 300, 10)];
NSString *str = @"This is a test text view to check the auto increment of height of a text view. This is only a test. The real data is something different.";
_textView.text = str;

[self.view addSubview:_textView];
CGRect frame = _textView.frame;
frame.size.height = _textView.contentSize.height;
_textView.frame = frame;

UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(10, 5 + frame.origin.y + frame.size.height, 300, 20)];
lbl.text = @"Hello!";
[self.view addSubview:lbl];

【讨论】:

这里的 '5' in y - UILabel 的坐标是我想要的 textView 和 Label 之间的间隙。【参考方案16】:

如果您使用自动布局并且您的 sizetofit 不起作用,那么请检查您的宽度限制一次。如果您错过了宽度限制,那么高度将是准确的。

无需使用任何其他 API。只需一行就可以解决所有问题。

[_textView sizeToFit];

在这里,我只关心高度,保持宽度固定,并错过了我的 TextView 在情节提要中的宽度限制。

这是为了显示来自服务的动态内容。

希望这可能会有所帮助..

【讨论】:

【参考方案17】:

以下内容就足够了:

    请记住将您的UITextViewscrolling enabled 设置为NO

    正确设置自动布局约束。

你甚至可以使用UITableViewAutomaticDimension

【讨论】:

【参考方案18】:

我查看了所有答案,所有答案都保持固定宽度并仅调整高度。如果你也想调整宽度,你可以很容易地使用这个方法:

所以在配置你的文本视图时,设置滚动禁用

textView.isScrollEnabled = false

然后在委托方法func textViewDidChange(_ textView: UITextView)中添加这段代码:

func textViewDidChange(_ textView: UITextView) 
    let newSize = textView.sizeThatFits(CGSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude))
    textView.frame = CGRect(origin: textView.frame.origin, size: newSize)

输出:

【讨论】:

委托方法没有被调用@Peter Stajger【参考方案19】:

使用 UITextViewDelegate 是最简单的方法:

func textViewDidChange(_ textView: UITextView) 
    textView.sizeToFit()
    textviewHeight.constant = textView.contentSize.height

【讨论】:

【参考方案20】:

禁用滚动

添加约束

并添加您的文字

[yourTextView setText:@"your text"];
[yourTextView layoutIfNeeded];

如果你使用UIScrollView,你也应该添加这个;

[yourScrollView layoutIfNeeded];

-(void)viewDidAppear:(BOOL)animated
    CGRect contentRect = CGRectZero;

    for (UIView *view in self.yourScrollView.subviews) 
         contentRect = CGRectUnion(contentRect, view.frame);
    
    self.yourScrollView.contentSize = contentRect.size;

【讨论】:

【参考方案21】:

当我需要使 UITextView 中的文本适合特定区域时,这很有效:

// 文本必须已经添加到子视图中,否则 contentviewsize 会出错。 - (void) reduceFontToFit: (UITextView *)tv UIFont *font = tv.font; 双pointSize = font.pointSize; 而(tv.contentSize.height > tv.frame.size.height && pointSize > 7.0) 点大小-= 1.0; UIFont *newFont = [UIFont fontWithName:font.fontName size:pointSize]; tv.font = 新字体; if (pointSize != font.pointSize) NSLog(@"font down to %.1f from %.1f", pointSize, tv.font.pointSize);

【讨论】:

【参考方案22】:

这是@jhibberd 的快速版本

    let cell:MsgTableViewCell! = self.tableView.dequeueReusableCellWithIdentifier("MsgTableViewCell", forIndexPath: indexPath) as? MsgTableViewCell
    cell.msgText.text = self.items[indexPath.row]
    var fixedWidth:CGFloat = cell.msgText.frame.size.width
    var size:CGSize = CGSize(width: fixedWidth,height: CGFloat.max)
    var newSize:CGSize = cell.msgText.sizeThatFits(size)
    var newFrame:CGRect = cell.msgText.frame;
    newFrame.size = CGSizeMake(CGFloat(fmaxf(Float(newSize.width), Float(fixedWidth))), newSize.height);
    cell.msgText.frame = newFrame
    cell.msgText.frame.size = newSize        
    return cell

【讨论】:

这个问题与语言无关。真的有必要回去为 UIKit 相关问题的所有答案编写 swift 端口吗?似乎这样会造成嘈杂的谈话。 这些问题大多没有具体的编程语言,所以即使你搜索swift语言你也可以在google找到它【参考方案23】:

对于 iOS 7.0,不要将 frame.size.height 设置为 contentSize.height(目前什么都不做),而是使用 [textView sizeToFit]

见this question。

【讨论】:

【参考方案24】:

这适用于 Swift 5,以防您希望在用户即时写入文本后适应您的 TextView。

只需使用 UITextViewDelegate 实现:

func textViewDidChange(_ textView: UITextView) 
    let newSize = textView.sizeThatFits(CGSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude))
    textView.frame.size = CGSize(width: newSize.width, height: newSize.height)

【讨论】:

【参考方案25】:

如果有其他人来这里,这个解决方案对我有用,1"Ronnie Liew"+4"user63934"(我的文本来自网络服务): 注意 1000(“在我的情况下”没有什么可以这么大)

UIFont *fontNormal = [UIFont fontWithName:FONTNAME size:FONTSIZE];

NSString *dealDescription = [client objectForKey:@"description"];

//4
CGSize textSize = [dealDescription sizeWithFont:fontNormal constrainedToSize:CGSizeMake(containerUIView.frame.size.width, 1000)];

CGRect dealDescRect = CGRectMake(10, 300, containerUIView.frame.size.width, textSize.height);

UITextView *dealDesc = [[[UITextView alloc] initWithFrame:dealDescRect] autorelease];

dealDesc.text = dealDescription;
//add the subview to the container
[containerUIView addSubview:dealDesc];

//1) after adding the view
CGRect frame = dealDesc.frame;
frame.size.height = dealDesc.contentSize.height;
dealDesc.frame = frame;

那就是……干杯

【讨论】:

【参考方案26】:

希望这会有所帮助:

- (void)textViewDidChange:(UITextView *)textView 
  CGSize textSize = textview.contentSize;
  if (textSize != textView.frame.size)
      textView.frame.size = textSize;

【讨论】:

这行不通!它会导致错误:“需要左值作为赋值的左操作数” 只能分配给textView.frame【参考方案27】:

我发现根据文本大小重新调整 UITextView 高度的最佳方法。

CGSize textViewSize = [YOURTEXTVIEW.text sizeWithFont:[UIFont fontWithName:@"SAMPLE_FONT" size:14.0]
                       constrainedToSize:CGSizeMake(YOURTEXTVIEW.frame.size.width, FLT_MAX)];

或者你可以使用

CGSize textViewSize = [YOURTEXTVIEW.text sizeWithFont:[UIFont fontWithName:@"SAMPLE_FONT" size:14.0]
                       constrainedToSize:CGSizeMake(YOURTEXTVIEW.frame.size.width, FLT_MAX) lineBreakMode:NSLineBreakByTruncatingTail];

【讨论】:

【参考方案28】:

对于那些希望 textview 实际向上移动并保持底线位置的人

CGRect frame = textView.frame;
frame.size.height = textView.contentSize.height;

if(frame.size.height > textView.frame.size.height)
    CGFloat diff = frame.size.height - textView.frame.size.height;
    textView.frame = CGRectMake(0, textView.frame.origin.y - diff, textView.frame.size.width, frame.size.height);

else if(frame.size.height < textView.frame.size.height)
    CGFloat diff = textView.frame.size.height - frame.size.height;
    textView.frame = CGRectMake(0, textView.frame.origin.y + diff, textView.frame.size.width, frame.size.height);

【讨论】:

【参考方案29】:

唯一可以使用的代码是在上面的 jhibberd 答案中使用“SizeToFit”的代码,但实际上除非您在 ViewDidAppear 中调用它或将其连接到 UITextView 文本更改,否则它不会被接收事件。

【讨论】:

【参考方案30】:

根据 Nikita Take 的回答,我在 Swift 中找到了以下解决方案,该解决方案适用于带有自动布局的 iOS 8:

    descriptionTxt.scrollEnabled = false
    descriptionTxt.text = yourText

    var contentSize = descriptionTxt.sizeThatFits(CGSizeMake(descriptionTxt.frame.size.width, CGFloat.max))
    for c in descriptionTxt.constraints() 
        if c.isKindOfClass(NSLayoutConstraint) 
            var constraint = c as! NSLayoutConstraint
            if constraint.firstAttribute == NSLayoutAttribute.Height 
                constraint.constant = contentSize.height
                break
            
        
    

【讨论】:

以上是关于如何根据内容调整 UITextView 的大小?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据内容调整 UITextView 的大小,宽度固定

表视图内的 UITextView 未根据内容调整大小

如何根据 UITextView 动态调整 xib 的大小

基于 UITextView 动态调整 CGRect 的大小

根据内容字体大小动态调整 UIWebView 的大小

在 UIScrollView 中自动调整 UITextView 的大小