0

向きを変えるときのiOSの動的アニメーションについて疑問に思っています。たとえば、私の iPad では、アニメーションはメニューで非常に「忠実」に見えます。要素 (アプリ、フォルダー、ドック、背景画像、ステータス バーなど) は、完璧な審美的な方法で適切な場所にスライドするように見えます...
しかし、App Store では、アプリ リストが別の配置になっているため、ずれを認識しました.
私の大きな質問: orientationChangeAnimation はまったく目の錯覚ですか、それとも本当に動​​的ですか? App Store では、実際の画面が回転しているように見えますが、同時にそのアルファ値が減少し、変更された画面の横向き/縦向きが同じ逆を行っています (アルファ値が増加すると同じピボットで回転します)。

4

2 に答える 2

1

実際、Springboard は (ドックのように) 物を動かしたり、(ほとんどのアプリ アイコンのように) アイテムをクロスフェードさせたりします。

viewWillLayoutSubviewsとは回転中にアニメーション ブロック内で呼び出されるためwillRotateToInterfaceOrientation、新しい値をアルファやフレームなどのアニメート可能なプロパティに簡単に割り当てることができます。タイミングを明示的に制御する必要がない限り、明示的なanimateWithDuration:animations:呼び出しは必要ありません。回転中に iOS が自動的にアニメーション化します。

例として、次のコードでは、赤と緑の四角形が画面の中央でクロスフェードし、回転中に青の四角形が左上と上中央の間を移動します。

CGRect b = self.view.bounds;
self.greenLabel = [[UILabel alloc] initWithFrame:CGRectMake(b.size.width / 2 - 50, b.size.height / 2 - 50, 100, 100)];
self.greenLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin;
self.greenLabel.backgroundColor = [UIColor greenColor];
[self.view addSubview:self.greenLabel];

self.redLabel = [[UILabel alloc] initWithFrame:self.greenLabel.frame];
self.redLabel.autoresizingMask = self.greenLabel.autoresizingMask;
self.redLabel.backgroundColor = [UIColor redColor];
[self.view addSubview:self.redLabel];

self.blueLabel = [[UILabel alloc] init];
self.blueLabel.backgroundColor = [UIColor blueColor];
[self.view addSubview:self.blueLabel];

...

- (void)viewWillLayoutSubviews {
  if (UIInterfaceOrientationIsLandscape(self.interfaceOrientation)) {
    self.greenLabel.alpha = 0;
    self.redLabel.alpha = 1;
    self.blueLabel.frame = CGRectMake((self.view.bounds.size.width - 100) / 2, 20, 100, 100);
  } else {
    self.greenLabel.alpha = 1;
    self.redLabel.alpha = 0;
    self.blueLabel.frame = CGRectMake(20, 20, 100, 100);
  }
}
于 2012-07-14T08:12:52.037 に答える
1

ええ、それは実際には非常に簡単で、多くのアプリで同様のことを行っています。機能を複製したい場合は、これを行うことができます:

willRotateToInterfaceOrientation メソッドまたは viewWillLayoutSubviews メソッドで、次のいずれかを実行できます。

//Fade out
[UIView animateWithDuration:0.3 animations:^ {
    yourController.view.alpha = 0.2;
}];

//Fade In
[UIView animateWithDuration:0.3 animations:^ {
    yourController.view.alpha = 1.0;
}];

//Fade out fade in
[UIView animateWithDuration:0.15 animations:^ {
    yourController.view.alpha = 0.2;
}];

[UIView animateWithDuration:0.15 animations:^ {
    yourController.view.alpha = 1.0;
}];

乾杯、

サム

于 2012-07-13T11:23:39.797 に答える