2015-01-16 71 views
3

我有一個UILabel,listDescription,它以5行顯示。它從數據庫中攫取大量文本,並且總數不確定。我已經實現了「顯示更多」按鈕,按下後,它將展開以顯示整個內容。我已經得到它工作正常,但我希望爲高度變化添加動畫。動畫更改UILabel行數

我的代碼:

@IBAction func toggleDesc(sender: AnyObject) { 
    if (self.listDescription.numberOfLines>0) 
    { 
     self.listDescription.numberOfLines=0 
     self.showMoreBtn.setTitle("Show Less", forState: UIControlState.Normal) 
    } 
    else 
    { 
     self.listDescription.numberOfLines=5 
     self.showMoreBtn.setTitle("Show More", forState: UIControlState.Normal) 
    } 
} 

我已經試過包裹numberOfLines在UIView.animateWithDuration變化,但這種變化仍是瞬間完成的。

我最好的猜測是將標籤放在視圖中,禁止從該視圖溢出,擴大行數,抓住標籤的新(未顯示)高度,並增加視圖的大小。但是我不知道在另一個方向做什麼,因爲在「輕量級顯示」被點擊時縮小它。

我很樂意提出建議,並且會做一些自己的嘗試。 [編輯:所以,我最初擔心,如果我替換顯式numberOfLines設置,並剛剛引入高度約束,文本將不會在最後截斷(如果它太長),但它似乎這樣做很好。

這就是說,能夠設置行數而不是高度是很方便的,因爲我希望它在多個設備上看起來一致,即使在我基於屏幕尺寸實現自動字體大小調整後,對於平板電腦等。

這可能是以後的考慮。我在標籤上有一個高度限制,我希望如果我刪除約束並將其包含在某些動畫代碼中,它將調整爲其全尺寸。但是,我仍然不能完全明白代碼的正確性。]

+0

看一看這個問題。看起來好像'numberOfLines'不是可動畫的。 http://stackoverflow.com/questions/20958175/ios-animating-uilabel-expand –

+0

啊。其中的一些信息和背後的想法絕對有幫助,雖然他們提供的示例/解決方案似乎在Objective C中,而不是Swift。 – MikeOShay

+0

我從中學習到,如果給標籤賦予高度約束,並且numberOfLines設置爲0,它將保持在該高度並仍然截斷文本的尾部(如果這是屬性中的設置)。所以這是我的一個擔憂,但仍然存在動畫問題。 現在我很好奇,如果有一種方法可以刪除高度限制並將調整動畫設置爲適當的全高。 – MikeOShay

回答

1

您可以嘗試幾件事情,在動畫中使用帶有選項的選項,並使用.AllowAnimatedContent,還可以修改動畫中標籤的框架,你將不得不根據文本,字體,字體大小和寬度來計算新的高度。

編輯:添加一個擴展來計算高度

extension UIFont { 
    func sizeOfString (string: NSString, constrainedToWidth width: Double) -> CGSize { 
     return string.boundingRectWithSize(CGSize(width: width, height: DBL_MAX), 
      options: NSStringDrawingOptions.UsesLineFragmentOrigin, 
      attributes: [NSFontAttributeName: self], 
      context: nil).size 
    } 
} 
+0

你知道我需要的代碼來獲得全文的高度嗎?如果這是我可以動態抓取的東西,那麼其餘部分應該會一起落下。我放棄了「改變numberOfLines」的想法,因爲它似乎沒有真正的好處,除了可能對其他設備尺寸自動調整大小的某種可擴展性。 – MikeOShay

+0

檢查答案,我添加了可用於計算字符串高度的代碼 –