为文本大小更新高度 UITextView

Posted

技术标签:

【中文标题】为文本大小更新高度 UITextView【英文标题】:Update height UITextView for text size 【发布时间】:2014-11-26 00:43:07 【问题描述】:

我正在尝试根据其中的文本更新 TextView。当用户输入更多文本时,我需要将高度增加到底部方向。超过一行。

我目前正在使用以下代码:

-(void)textViewDidChange:(UITextView *)textView
    CGRect newFrame = self.frame;
    newFrame.size.height = [self textViewHeightForAttributedText:
                       [[NSMutableAttributedString alloc] initWithString:self.text]
                       andWidth:self.frame.size.width];

    [self setNeedsLayout];



- (CGFloat)textViewHeightForAttributedText: (NSAttributedString*)text andWidth: 
(CGFloat)width 
    UITextView *calculationView = [[UITextView alloc] init];
    [calculationView setAttributedText:text];
    CGSize size = [calculationView sizeThatFits:CGSizeMake(width, FLT_MAX)];
    return size.height;

但是,这不会更新UITextView 的高度。我已经设置了UITextView 的代表。这段代码写在UITextView子类的子类中。

【问题讨论】:

【参考方案1】:

看起来你实际上并没有改变 textView 的高度,你只是创建一个与 textView 尺寸相同的新框架,调整新框架的大小,然后什么都不做。

尝试添加:

textView.frame = newFrame;

【讨论】:

我明白了,我添加了该行,但不幸的是这没有帮助。即使我认为你是对的,所以我会留下那行:) 你能确定 textViewDidChange 被调用了吗?在其中弹出一个 NSLog 语句,并确保每次按下某个键时都能看到控制台消息。 是的,我确定,刚刚仔细检查过。 这个对象是什么类,即“自我”是什么。它是从 UITextView 继承的,并且您正在尝试更新此类的实例的 UITextView 吗?还是“自我”是一个视图控制器?在这种情况下,self.frame 是什么? self 是 UITextView。我会提到这是写在 UITextView 的子类中【参考方案2】:

您可以使用名为 HPGrowingTextView for i OS 的 Coco-control。类似于 Apple 在 SMS 中使用的那个。

通过此链接。https://www.cocoacontrols.com/controls/hpgrowingtextview

【讨论】:

【参考方案3】:
- (void)textViewDidChange:(UITextView *)textView

    UIFont *myFont = [UIFont systemFontOfSize:14];
    CGSize size =   [self sizeOfText:textView.text widthOfTextView:TextviewWidth withFont:myFont];
    NSLog(@"Height : %f", size.height);
    txtView_Details.frame = CGRectMake(txtView_Details.frame.origin.x, txtView_Details.frame.origin.y, txtView_Details.frame.size.width, size.height);


-(CGSize)sizeOfText:(NSString *)textToMesure widthOfTextView:(CGFloat)width withFont:(UIFont*)font

    CGSize ts = [textToMesure sizeWithFont:font constrainedToSize:CGSizeMake(width-20.0, FLT_MAX) lineBreakMode:NSLineBreakByWordWrapping];
    return ts;

【讨论】:

以上是关于为文本大小更新高度 UITextView的主要内容,如果未能解决你的问题,请参考以下文章

在ios中设置文本(大多数时候)后,UILabel不更新其高度

使文本高度为 div 的 100%?

根据 UITableViewCell 标签高度和宽度调整背景图片大小

当大小不成比例时如何在 UILabel 中适合文本

通过文本字段上的自动布局调整字体大小并改变高度

加载数据后 Recyclerview 项目高度更改