2013-11-20 15 views
5

私はそれにサブビューとしてUILabelを持つUIViewを持っています。Autolayoutアニメーション制約はサブビューをアニメートしません

今は...アニメーション(制約の一定の性質を変化させる)とのUIViewの幅を変更して、アニメーションのUIViewでlayoutIfNeededを呼び出す)

ビュー、通常のサイズ変更が、 UILabel(サブビュー)されていますフォントサイズを 'end'-sizeに変更しますが、uiviewのように正しくアニメーション化されませんでした。スーパーの唯一の定数が変更されます場合

WWDC 2012のセッションによるとサブビューをアニメーション化する必要があります。

UILabelは、フォントサイズを変更する必要があり、次に小さい0,1の最小フォントスケールを有しています。

答えて

4

制約。ラベルにはadjustsFontSizeToFitWidthminimumScaleFactorが設定されています。

私はUIViewContentModeScaleAspectFitにラベルcontentModeを設定することで、それを修正。デフォルトでは、ラベルはUIViewContentModeLeftです。タイマー付き

2

このようにテキストのサイズをアニメートすることはできません。これを行うには、ラベルのスナップショットビューを作成し、そのビューをラベルに追加し、アニメーションを実行してから、スナップショットビューを削除します。このコードは小さなテキストを少し下に移動しますが、ラベルの表示を解除してイメージビューを削除すると、動きがごくわずかですが、非常に良いように見えます。ラベルを含む小さなビューのサイズは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]; 
} 
+0

後の編集上のコードでは、残念ながらも非常にびくびく見えます..:/ –

+1

スナップショットのアイデアは非常にハックであり、このように接近してはならない、uがないと思いますか? –

+0

@ Christian'fuzi'Orgler、いいえ、私はハッキーだとは思わない。アップルはこの独自のアニメーションの一部でこの「トリック」を使用しています。それ以外に何がありますか?あなたの最初のコメントについては、はい、それは私が言ったことです - 私はあなたがテキストのサイズを小さくしようとしていない場合は、時にはうまく動作するビューのサブビューをアニメーション化する方法を示すことを含めた。 – rdelmar

関連する問題