0

当我转动方向时,我想知道 iOS 中的动态动画。例如,在我的 iPad 上,动画在菜单中看起来非常“真实”。元素(应用程序、文件夹、停靠栏、背景图像、状态栏……)似乎以一种完美的审美方式滑到了正确的位置……
但在 App Store 中我发现了一个偏差,因为应用程序列表有另一种排列方式.
我的大问题:orientationChangeAnimation 是一种视错觉,还是真的如此动态?在 App Store 中,看起来实际屏幕正在转动,同时它的 alpha 值正在减小,而更改后的屏幕的横向/纵向方向也在做同样的反转(随着 alpha 值的增加在同一个轴上转动)。

4

2 回答 2

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 回答
1

事实上,Springboard 确实可以移动东西(比如停靠栏),它还可以交叉淡入淡出项目(比如大多数应用程序图标)。

由于viewWillLayoutSubviewswillRotateToInterfaceOrientation在旋转期间在动画块内被调用,因此您可以简单地为 alpha 和 frame 等可动画属性分配新值。除非你想显式控制时间,否则不需要显式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 回答