ios - textview換行 - uitextview placeholder




如何調整UITextView的內容大小? (20)

這不再適用於iOS 7或更高版本

實際上有一個非常簡單的方法來調整UITextView的正確高度的內容。 它可以使用UITextView contentSize

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

需要注意的一點是,正確的contentSize UITextView通過addSubview添加到視圖後才可用。 在此之前它等於frame.size

如果自動佈局為ON,這將不起作用。 對於自動佈局,一般的方法是使用sizeThatFits方法並在高度約束上更新constant量值。

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

heightConstraint是您通常通過將屬性鏈接到故事板中創建的高度約束來通過IBOutlet設置的佈局約束。

為了增加這個驚人的答案,2014年,如果你:

[self.textView sizeToFit];

僅與iPhone6 +的行為有所不同:

僅使用6+(不是5或6),它為UITextView添加了“多一個空行”。 “RL解決方案”完美地解決了這個問題:

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

它修復了6+以上的“額外線路”問題。

有沒有一種好方法來調整UITextView的大小以符合其內容? 比如說我有一個包含一行文本的UITextView

"Hello world"

然後我添加另一行文字:

"Goodbye world"

在Cocoa Touch中有一個很好的方法來獲取將保存文本視圖中所有行的rect ,以便我可以相應地調整父視圖?

作為另一個例子,查看日曆應用程序中事件的註釋字段 - 注意單元格(以及它包含的UITextView )如何擴展以保存註釋字符串中的所有文本行。


Swift的答案:下面的代碼計算你的textView的高度。

                let maximumLabelSize = CGSize(width: Double(textView.frame.size.width-100.0), height: DBL_MAX)
                let options = NSStringDrawingOptions.TruncatesLastVisibleLine | NSStringDrawingOptions.UsesLineFragmentOrigin
                let attribute = [NSFontAttributeName: textView.font!]
                let str = NSString(string: message)
                let labelBounds = str.boundingRectWithSize(maximumLabelSize,
                    options: NSStringDrawingOptions.UsesLineFragmentOrigin,
                    attributes: attribute,
                    context: nil)
                let myTextHeight = CGFloat(ceilf(Float(labelBounds.height)))

現在您可以將myTextHeight的高度設置為myTextHeight


以下事情就足夠了:

  1. 只記得為你的UITextView設置滾動NO

  1. 正確設置自動佈局約束。

你甚至可以使用UITableViewAutomaticDimension


你有沒有嘗試[textView sizeThatFits:textView.bounds]

編輯:sizeThatFits返回大小,但實際上並沒有調整組件大小。 我不確定這是你想要的,還是[textView sizeToFit]更符合你的需求。 無論是哪種情況,我都不知道它是否會完全適合你想要的內容,但是這是第一次嘗試。


剛剛設置

textView.scrollEnabled = false

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


另一種方法是使用NSString方法查找特定字符串將會佔用的大小:

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

這將返回適合給定字符串的給定字體的矩形大小。 通過所需寬度和最大高度的尺寸,然後您可以查看返回的高度以適合文本。 有一個版本可以讓你指定換行符模式。

然後,您可以使用返回的大小來更改視圖的大小以適應。


在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;
    }
}

在我(有限)的經歷中,

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

並不尊重換行符,所以你最終可以CGSize比實際需要的更小的CGSize

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

確實似乎尊重換行符。

此外,該文本實際上並未呈現在UITextView的頂部。 在我的代碼中,我將UITextView的新高度設置為比sizeOfFont方法返回的高度大24個像素。


如果您需要在staticTableView動態調整staticTableViewtableViewCell大小,這裡是答案

[ https://.com/a/43137182/5360675][1] [1 https://.com/a/43137182/5360675][1]


如果有其他人來到這裡,這個解決方案適用於我,1“Ronnie Liew”+4“user63934”(我的文本從web服務到達):請注意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;

那就是......乾杯


對於那些希望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);
}

希望這可以幫助:

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

我們可以通過約束來實現。

  1. 為UITextView設置高度約束。

2.為該高度約束創建IBOutlet。

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

3.不要忘記為你的textview設置代表。

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.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)
}

輸出:


我發現了一種方法來根據文本內部的文本調整文本字段的高度,並根據文本字段的高度在它下面安排一個標籤! 這是代碼。

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];

我發現根據文本的大小重新調整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];

為了在UITableViewCell創建一個動態調整大小的UITextView ,我發現以下組合在iOS 8 SDK中可以在Xcode 6中使用:

  • UITextView添加到UITableViewCell並將其約束到兩側
  • UITextViewscrollEnabled屬性設置為NO 。 啟用滾動功能後, UITextView的框架與內容大小無關,但禁用滾動功能時,兩者之間存在關係。
  • 如果您的表格使用44的原始默認行高,那麼它將自動計算行高,但如果您將默認行高更改為其他值,則可能需要手動打開viewDidLoad中行高的自動計算:

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

對於只讀動態調整UITextView的大小,就是這樣。 如果您允許用戶編輯UITextView的文本,則還需要:

  • 實現UITextViewDelegate協議的textViewDidChange:方法,並在每次編輯文本時告訴tableView自己重新繪製:

    - (void)textViewDidChange:(UITextView *)textView;
    {
        [tableView beginUpdates];
        [tableView endUpdates];
    }
    
  • 不要忘記在StoryboardtableView:cellForRowAtIndexPath:設置UITextView委託tableView:cellForRowAtIndexPath:


當我需要使UITextView文本適合特定區域時,這很好用:

// The text must already be added to the subview, or contentviewsize will be wrong.

- (void) reduceFontToFit: (UITextView *)tv {
    UIFont *font = tv.font;
    double pointSize = font.pointSize;

    while (tv.contentSize.height > tv.frame.size.height && pointSize > 7.0) {
        pointSize -= 1.0;
        UIFont *newFont = [UIFont fontWithName:font.fontName size:pointSize];
        tv.font = newFont;
    }
    if (pointSize != font.pointSize)
        NSLog(@"font down to %.1f from %.1f", pointSize, tv.font.pointSize);
}

結合麥克麥克馬斯特的回答,你可能想要做一些事情:

[myTextView setDelegate: self];

...

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

這裡是@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




uitextview