2013-11-20 4 views
5

У меня есть UIView, который имеет UILabel как subview в нем.Ограничение анимации Autolayout не анимирует subviews

Теперь я изменить ширину UIView с анимацией (изменение постоянного свойства ограничения) и вызвать layoutIfNeeded в UIView анимации ...)

Вид изменении размеров нормальный, но UILabel (подвид) изменяет размер шрифта до размера «end'-size», но не оживляет его, как uiview.

В соответствии с сессией WWDC 2012 подвид должен оживить, если изменится только константа супервизора.

UILabel имеет минимальную шкалу шрифта 0,1, которая меньше, чем размер шрифта должен быть изменен.

ответ

4

Я изо всех сил оживляющий UILabel изменения размера, изменив его width ограничение. На этикетке были установлены adjustsFontSizeToFitWidth и minimumScaleFactor комплект.

Я установил его, установив метки contentMode на номер UIViewContentModeScaleAspectFit. По умолчанию для меток это UIViewContentModeLeft.

2

Я не думаю, что вы можете анимировать размер текста таким образом. Единственный способ, которым я могу это сделать, - создать представление моментального снимка метки, добавить этот вид над меткой, сделать анимацию, а затем удалить представление моментального снимка. Этот код немного перемещает меньший текст, но он выглядит довольно неплохо, с очень небольшим движением, когда вы показываете ярлык и удаляете изображение. Маленький вид, который содержит ярлык, был размером 185x36, а метка имела ограничения по 20 с каждой стороны smallView и 8 до верхней и 7 до нижней. Я добавляю те же ограничения в коде к представлению изображения.

@interface ViewController() 
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *widthCon; // width constraint on smallView 
@property (weak,nonatomic) IBOutlet UIView *smallView; // view that the label is embedded in 
@property (weak,nonatomic) IBOutlet UILabel *label; 
@end 

@implementation ViewController 

- (IBAction)shrinkView:(id)sender { 

    UIView *snapshot = [self.label snapshotViewAfterScreenUpdates:YES]; 
    [snapshot setTranslatesAutoresizingMaskIntoConstraints:NO]; 
    [self.smallView addSubview:snapshot]; 
    [self.smallView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-20-[snapshot]-20-|" options:0 metrics:nil views:@{@"snapshot":snapshot}]]; 
    NSLayoutConstraint *topCon = [NSLayoutConstraint constraintWithItem:snapshot attribute:NSLayoutAttributeTop relatedBy:0 toItem:self.smallView attribute:NSLayoutAttributeTop multiplier:1 constant:8]; 
    NSLayoutConstraint *bottomCon = [NSLayoutConstraint constraintWithItem:self.smallView attribute:NSLayoutAttributeBottom relatedBy:0 toItem:snapshot attribute:NSLayoutAttributeBottom multiplier:1 constant:7]; 
    [self.smallView addConstraints:@[topCon,bottomCon]]; 
    [self.smallView layoutSubviews]; 
    self.label.alpha = 0; 
    self.widthCon.constant = 100; 
    topCon.constant = 18; 
    bottomCon.constant = 10; 
    [UIView animateWithDuration:.5 animations:^{ 
      [self.view layoutIfNeeded]; 
     } completion:^(BOOL finished) { 
      self.label.alpha = 1; 
      [snapshot removeFromSuperview]; 
     }]; 
} 

После Edit:

Существует способ оживить вид так, чтобы метка также одушевляет вниз, а не идти сразу к его конечному размеру. Вы должны анимировать ограничение непосредственно с помощью таймера. (Посмотрите пояснения примерно на 31 минуту в видео WWDC 2012, «Лучшие практики для мастеринга авто макета»). Это работает, чтобы оживить размер метки, но изменение размера шрифта является неустойчивым и не выглядит таким хорошим. Если у вас есть ограничение ширины к представлению о том, что метка находится в (а метка имеет ограничения для обеих сторон), то вы можете сделать это:

-(IBAction)animateSizeChange:(id)sender { 
    [NSTimer scheduledTimerWithTimeInterval:.001 target:self selector:@selector(doStuff:) userInfo:Nil repeats:YES]; 
} 

-(void)doStuff:(NSTimer *) aTimer { 
    self.widthCon.constant -= .2; 
    if (self.widthCon.constant <90) [aTimer invalidate]; 
} 
+0

Код на после-редактирование с таймером выглядит, к сожалению, также очень нервным ..:/ –

+1

идея моментального снимка очень взламывает и не должна подходить так, не так ли? –

+0

@ Christian'fuzi'Orgler, нет, я не думаю, что это хак. Apple использует этот «трюк» в некоторых своих анимациях. Кроме того, какая альтернатива? Что касается вашего первого комментария, да, это скачкообразно, вот что я сказал - я включил это только для того, чтобы показать способ, которым вы можете анимировать подзаголовок представления, который иногда отлично работает, если вы не пытаетесь уменьшить размер текста. – rdelmar

Смежные вопросы