Я не думаю, что вы можете анимировать размер текста таким образом. Единственный способ, которым я могу это сделать, - создать представление моментального снимка метки, добавить этот вид над меткой, сделать анимацию, а затем удалить представление моментального снимка. Этот код немного перемещает меньший текст, но он выглядит довольно неплохо, с очень небольшим движением, когда вы показываете ярлык и удаляете изображение. Маленький вид, который содержит ярлык, был размером 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];
}
Код на после-редактирование с таймером выглядит, к сожалению, также очень нервным ..:/ –
идея моментального снимка очень взламывает и не должна подходить так, не так ли? –
@ Christian'fuzi'Orgler, нет, я не думаю, что это хак. Apple использует этот «трюк» в некоторых своих анимациях. Кроме того, какая альтернатива? Что касается вашего первого комментария, да, это скачкообразно, вот что я сказал - я включил это только для того, чтобы показать способ, которым вы можете анимировать подзаголовок представления, который иногда отлично работает, если вы не пытаетесь уменьшить размер текста. – rdelmar