2014-01-06 60 views
7

我有一個與3行文字發起一個UILabel:iOS版動畫的UILabel擴大

locationDescription = [[UILabel alloc]init]; 
locationDescription.numberOfLines = 3; 
[locationDescription setTranslatesAutoresizingMaskIntoConstraints:NO]; 
[self addSubview:locationDescription]; 

然後我有一個按鈕,擴展標籤:

- (void)buttonPressed:(UIButton *)sender{ 
    NSLog(@"Pressed"); 
    [UIView animateWithDuration:1 
        animations:^{locationDescription.numberOfLines = 0;} 
    ]; 
} 

的標籤要求的性能讓每條額外的線路一次顯示一個。標籤可以很好地展開,但過渡不是動畫效果,所有線條都會立即顯示出來。

我錯過了什麼?

+0

您設置的動畫體外線的號碼,然後裏面。這是一個錯字嗎? – Putz1103

+0

是的,對不起。代碼編輯。 – sheepgobeep

+0

可能不是問題,但仍然是:'-init'不是UILabel的指定初始化程序 - 使用'-initWithFrame:'代替。 – Caleb

回答

12

可以動畫的行數。它會更改UILabel的固有大小。您需要在包含UILabel的視圖上的動畫塊內調用layoutIfNeeded。在這裏,我在表格中附加一個輕擊手勢,以在0(儘可能多)行和1行之間切換。

func tapLabel(tapGesture: UITapGestureRecognizer) 
{ 
    if let label = tapGesture.view as? UILabel { 
     label.numberOfLines = label.numberOfLines == 0 ? 1 : 0 
     UIView.animateWithDuration(0.5) { 
     label.superview?.layoutIfNeeded() 
     } 
    } 
} 

enter image description here

+0

這工作。一個問題:根據我的經驗,label.numberOfLines必須從0開始, – MattyG

+10

,將「視圖」下的「內容模式」設置爲「頂部」,它將平滑地顯示隱藏線... –

+0

@AxelZehden這是我尋找的答案! –

2

您不能爲動畫的行數設置動畫,您應該動畫動畫的大小,並將行數從一開始就設置爲0。

我沒有添加高度計算代碼,因爲它會隱藏真實的動畫。

self.locationDescription = [[UILabel alloc] init]; 
self.locationDescription.numberOfLines = 0; 
[locationDescription setTranslatesAutoresizingMaskIntoConstraints:NO]; 

// Say, it starts with 50. In your real code, height should be calculated 
// to fit the size you want, rounded to lines 
NSDictionary *viewsDict = @{@"locationDescription": self.locationDescription}; 
[self.locationDescription addConstraints: 
[NSLayoutConstraint constraintsWithVisualFormat:@"V:[locationDescription(50)]" 
             options:0 metrics:nil 
              views:viewsDict]; 

然後在行動上,

- (void)buttonPressed:(UIButton *)sender 
{ 
    NSLog(@"Pressed"); 
    // Assuming there is only one constraint. If not, assign it to another property 
    // I put 500, but, again, real size rounded to line height should be here 
    self.locationDescription.constraints[0].constant = 500; 
    [UIView animateWithDuration:1 animations:^{ 
     // Layouting superview, as its frame can be updated because of a new size 
     [self.locationDescription.superview layoutIfNeeded]; 
    }]; 
} 

此外,你應該分配給locationDescription屬性和訪問它與前self.

+0

實際上,我開始這樣做,但layoutIfNeeded似乎也重繪了文本,所以當對象動畫時,文本和邊界框都在四處移動。 – sheepgobeep

+0

@sheepgobeep一種選擇是使用'TTTAttributedLabel',它具有垂直對齊支持,在這種情況下,文本將保持在同一個位置,顯示新行。 – coverback

2

UIView animateWithDuration的塊對象包含提交到視圖的更改。這是您以編程方式更改視圖層次結構中視圖的任何動畫屬性的位置。但是您指定的屬性numberOfLines不是動畫屬性。

UIView類是父類的UILabel的以下屬性動畫:

@property frame 
@property bounds 
@property center 
@property transform 
@property alpha 
@property backgroundColor 
@property contentStretch