2015-04-03 147 views
20

在我的視圖控制器中,我有一個UITextView。該文本視圖中填充了一個字符串。字符串可以是短或長。根據字符串的長度,textview的高度必須調整。 我使用故事板和自動佈局。如何在SWIFT中將文本視圖的高度調整爲其內容?

我有一些與textview的高度的麻煩。

有時候,高度可以根據文本進行完美調整。有時,不,文本在第一行被裁剪。下面,textview是黃色的。藍色是scrollview內的容器視圖。紫色是一張照片的地方。

title1title2

的文本是從我的核心數據的基礎上,他們是字符串屬性。 在屏幕1和2之間,唯一改變的是字符串。
如果我打印在控制檯中的字符串我有正確的文本:

my amazing new title 

Another funny title for demo 

我的TextView的約束:

enter image description here

我不明白爲什麼我有2個不同的顯示器。

編輯

我試過@Nate建議,在viewDidLoad中,我說:

myTextViewTitle.text="my amazing new title" 

    myTextViewTitle.setContentHuggingPriority(1000, forAxis: UILayoutConstraintAxis.Vertical) 
    myTextViewTitle.setContentCompressionResistancePriority(1000, forAxis: UILayoutConstraintAxis.Vertical) 
    myTextViewTitle.setTranslatesAutoresizingMaskIntoConstraints(false) 

    let views = ["new_view": myTextViewTitle] 
    var constrs = NSLayoutConstraint.constraintsWithVisualFormat("|-8-[new_view]-8-|", options: NSLayoutFormatOptions(0), metrics: nil, views: views) 
    self.view.addConstraints(constrs) 
    self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-8-[new_view]", options: NSLayoutFormatOptions(0), metrics: nil, views: views)) 
    self.myTextViewTitle.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:[new_view([email protected])]", options: NSLayoutFormatOptions(0), metrics: nil, views: views)) 

沒有結果。帶或不帶高度contraint增加了我在Interface Builder的TextView ...

EDIT 2

我需要一個UITextView的,而不是一個的UILabel,因爲後退按鈕,使用排除路徑。

 let exclusionPathBack:UIBezierPath = UIBezierPath(rect: CGRect(x:backButton.bounds.origin.x, y:backButton.bounds.origin.y, width:backButton.bounds.width+10, height:backButton.bounds.height)) 
    myTextViewTitle.textContainer.exclusionPaths=[exclusionPathBack] 
+0

嘗試SOLU這裏列出:http://stackoverflow.com/questions/16009405/uilabel-sizetofit-doesnt-work-with-autolayout-ios6。 'sizeToFit'方法是要走的路,但在你的情況下你也需要約束。 – 2015-04-03 12:36:29

+0

在UITextView中啓用了滾動嗎? – Abdullah 2015-04-03 15:43:25

+0

@NateLee,這個解決方案是針對UILabel的。我使用UITextView。 – cmii 2015-04-03 16:26:51

回答

37

我找到了解決方案。

我關注的是UITextView的高度,然後我讀了一篇關於縱橫比的文章。我想嘗試這個工作!

所以在故事板中,我爲textview添加了縱橫比,並且選中了「在構建時移除」選項。

在viewDidLayoutSubviews(),我寫道:

override func viewDidLayoutSubviews() { 

    super.viewDidLayoutSubviews() 

    let contentSize = self.myTextViewTitle.sizeThatFits(self.myTextViewTitle.bounds.size) 
    var frame = self.myTextViewTitle.frame 
    frame.size.height = contentSize.height 
    self.myTextViewTitle.frame = frame 

    aspectRatioTextViewConstraint = NSLayoutConstraint(item: self.myTextViewTitle, attribute: .Height, relatedBy: .Equal, toItem: self.myTextViewTitle, attribute: .Width, multiplier: myTextViewTitle.bounds.height/myTextViewTitle.bounds.width, constant: 1) 
    self.myTextViewTitle.addConstraint(aspectRatioTextViewConstraint!) 

} 

它完美。

+0

這是一個很好的解決方案,我在textViewDidChange委託方法中使用'textView.sizeThatFits',完美地工作。好的答案,謝謝 – Swinny89 2015-09-04 15:59:37

+0

我爲這個問題嘗試了很多不同的解決方案和外部庫,這是唯一對我有用的解決方案。謝謝你,先生。 – Ces 2016-06-04 01:22:08

+0

感謝@cmii你救了我的一天..... – 2017-08-29 11:43:15

0

爲什麼沒有用於後退按鈕的圖像和用於文本的UILabel,並使用autolayout來定位它們?也許是黃色背景的第三種觀點。

+0

是的,有一個原因。這是因爲我想在後退按鈕的左邊第一行,按鈕下面的第二行和第三行。在我的截圖中,我還沒有設置線高。 – cmii 2015-04-06 16:51:08

0

我簡單的解決方案,以一個非常類似的問題:

我使用的標籤設置爲0,而不是試圖用文本字段或視圖的行數。然後,我將前緣和後緣剪裁到標籤的容器上,這些容器限制了它們的寬度,以0作爲約束的常量。問題是將行數設置爲0以允許標籤根據其內容增長或縮小。對於我爲寬度配置的所有不同大小類(我的情況下的容器寬度),文本不會被切碎,標籤的高度也不會超過它們的內容。測試IOS 8.0和更高版本(還要確保'顯式'未選中所有標籤的'首選寬度'屬性旁邊的標籤寬度以適應不同大小類別) - 完美地工作。

20

首先,禁止的UITextView的滾動。 兩個選項:

  1. 取消選中滾動在.xib中啓用。
  2. [TextView setScrollEnabled:NO];

創建一個UITextView並將其與IBOutlet(TextView)連接。 使用默認高度添加UITextView高度約束,將其與IBOutlet(TextViewHeightConstraint)連接起來。 當你異步設置你的UITextView文本時,你應該計算UITextView的高度並設置UITextView的高度約束。 示例代碼:

CGSize sizeThatFitsTextView = [TextView sizeThatFits:CGSizeMake(TextView.frame.size.width, MAXFLOAT)]; 

TextViewHeightConstraint.constant = sizeThatFitsTextView.height; 
+3

應當注意的是,如果你使用的自動佈局中,「滾動啓用」選擇在故事板影響如何約束儘管它沒有明確地表明這種關係,但它們都是佈置好的。我在自動佈局約束垃圾中掙扎,直到我取消勾選複選框。之後,自動佈局解決了自己的問題。 – dstepan 2016-12-19 17:37:18

+0

@dstepan感謝您將該設置滾動爲false的技巧!這真的幫助 – Hordaric 2017-03-19 13:24:15

+0

謝謝你,工作很棒! – 2017-10-05 06:21:38

5

在迅速2.3:

func textViewDidChange(textView: UITextView) { 

    let size = textView.sizeThatFits(CGSize(width: textView.frame.size.width, height: CGFloat.max)) 
    if size.height != TXV_Height.constant && size.height > textView.frame.size.height{ 
     TXV_Height.constant = size.height 
     textView.setContentOffset(CGPointZero, animated: false) 
    } 
} 
6

在夫特3.0,其中tvHeightConstraint是主體的TextView的高度約束(如果使用多個textviews,將其添加到功能的輸入):

func textViewDidChange(textView: UITextView) { 

     let size = textView.sizeThatFits(CGSize(width: textView.frame.size.width, height: CGFloat.greatestFiniteMagnitude)) 
     if size.height != tvHeightConstraint.constant && size.height > textView.frame.size.height{ 
      tvHeightConstraint.constant = size.height 
      textView.setContentOffset(CGPoint.zero, animated: false) 
     } 
    } 

H/T到@cmi和@Pablo阮

相關問題