2014-01-06 4 views
7

У меня есть UILabel, который инициированный с 3 строк текста: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. Вам нужно вызвать layoutIfNeeded внутри вашего блока анимации в представлении, содержащем UILabel. Здесь я прикрепляю жест привязки к таблице, чтобы переключить ее между 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

с «Content Mode» под «View» до «top» он будет гладко раскрывать скрытые строки ... –

+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