このようにテキストのサイズをアニメートすることはできません。これを行うには、ラベルのスナップショットビューを作成し、そのビューをラベルに追加し、アニメーションを実行してから、スナップショットビューを削除します。このコードは小さなテキストを少し下に移動しますが、ラベルの表示を解除してイメージビューを削除すると、動きがごくわずかですが、非常に良いように見えます。ラベルを含む小さなビューのサイズは185x36で、ラベルはsmallViewの各側に20、上部に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];
}];
}
は、編集後:
は、ラベルもその端の大きさにすぐに行くのではなく、ダウンアニメーション化するようにビューをアニメーション化する方法があります。タイマーを使用して制約を直接アニメーション化する必要があります(WWDC 2012のビデオ、「自動レイアウトをマスターするためのベストプラクティス」を参照)。これはラベルのサイズをアニメートするために働きますが、フォントサイズの変化は不安定であり、そのようには見えません。あなたはラベルがであるという見解に幅の制約を持っている(とラベルが両側に制約がある)場合は、この操作を行うことができます。私はそのwidth
を変更することにより、UILabel
リサイズをアニメーション苦しんでいた
-(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];
}
後の編集上のコードでは、残念ながらも非常にびくびく見えます..:/ –
スナップショットのアイデアは非常にハックであり、このように接近してはならない、uがないと思いますか? –
@ Christian'fuzi'Orgler、いいえ、私はハッキーだとは思わない。アップルはこの独自のアニメーションの一部でこの「トリック」を使用しています。それ以外に何がありますか?あなたの最初のコメントについては、はい、それは私が言ったことです - 私はあなたがテキストのサイズを小さくしようとしていない場合は、時にはうまく動作するビューのサブビューをアニメーション化する方法を示すことを含めた。 – rdelmar