2016-09-01 64 views
3

我使用下面的代碼用於計算文本的高度,然後設置這個高度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 

TextView的高度基地這是工作完美的UILabelUITextView某個時候計算錯誤。
我認爲問題發生是因爲UITextView的填充(左,右)大於UILabel
那麼我如何計算在UITextView中顯示的文本的正確大小。任何幫助或建議將不勝感激。

像下面
與尺寸相同的(300),相同的字體,文字相同但在2行的顯示UITextView描述圖像,但在1行UILabel。 而我的推算身高回報20,它不足以在2行顯示的代碼,所以UITextView不能顯示完整的內容

我之所以需要計算UITextView基礎的高度上的文字,因爲我UITextView在彈出窗口中。 而彈出的高度將取決於TextView高度

enter image description here

+0

您可以綁定textview高度常量,然後用它來更新身高我猜 –

+0

只需訪問這裏http://stackoverflow.com/questions/31678779/how-to-dynamically-change-the-textview-height-and- cell-height-according-the-t –

+0

可能的重複[如何調整UITextView的內容大小?](http://stackoverflow.com/questions/50467/how-do-i-size-a- uitextview-to-its-content) – Sandy

回答

3

你並不需要計算基於文本的UITextview高度。

只要改變幀,將高度是這樣的:

textview.size.height = textview.contentSize.height; 

這是簡單的解決方案。我希望這可以幫助你。

+0

我的情況是不同的,所以我不能使用這條路。請檢查我的更新 –

6

有兩件事情可以嘗試:

  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}} 
+0

textView.textContainer.lineFragmentPadding做了訣竅... – TheEye

0

此計算任何字符串的大小,無論是否放他們在文本視圖。

let frame = NSString(string: yourText).boundingRect(
    with: CGSize(width: yourDesiredWidth, height: .infinity), 
    options: [.usesFontLeading, .usesLineFragmentOrigin], 
    attributes: [.font : yourFont], 
    context: nil) 

let height = frame.size.height 
0

self.textView.textContainerInset = UIEdgeInsets.zero self.textView.textContainer.lineFragmentPadding = 0

在情節串連圖板或XIB標記的TextView高度> = 0。

如果您使用帶有表格視圖的文本視圖。 根據內容計算細胞高度,textview會調整它的空間。