当我转动方向时,我想知道 iOS 中的动态动画。例如,在我的 iPad 上,动画在菜单中看起来非常“真实”。元素(应用程序、文件夹、停靠栏、背景图像、状态栏……)似乎以一种完美的审美方式滑到了正确的位置……
但在 App Store 中我发现了一个偏差,因为应用程序列表有另一种排列方式.
我的大问题:orientationChangeAnimation 是一种视错觉,还是真的如此动态?在 App Store 中,看起来实际屏幕正在转动,同时它的 alpha 值正在减小,而更改后的屏幕的横向/纵向方向也在做同样的反转(随着 alpha 值的增加在同一个轴上转动)。
问问题
778 次
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 确实可以移动东西(比如停靠栏),它还可以交叉淡入淡出项目(比如大多数应用程序图标)。
由于viewWillLayoutSubviews
和willRotateToInterfaceOrientation
在旋转期间在动画块内被调用,因此您可以简单地为 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 回答