7

我正在尝试在我的 iOS 应用程序中创建一个动画,其中一个新视图从左侧滑到屏幕上,而主视图滑到右侧为其腾出空间。主视图是我的视图控制器顶视图的子视图,而滑入的侧视图是从单独的 xib 文件加载的。

如果它是相关的,这是我加载侧视图的代码,从我的主视图控制器的 viewDidLoad 方法调用:

sideViewController = [[SideViewController alloc] init];
[sideViewController loadView];

sideView = sideViewController.topView;
[self.view addSubview:sideView];
sideView.hidden = YES;
sideView.frame = CGRectMake(-200, 0, 200, 460);

这是被调用来为两个视图设置动画的代码:

sideView.hidden = NO;
[UIView animateWithDuration:0.25f
                 animations:^{                         
                     mainView.frame = CGRectMake(200, 0, 320, 460);
                     sideView.frame = CGRectMake(0, 0, 200, 460);
                 }];

这看起来很简单。但由于某种原因,只有 sideView 动画 - mainView 不会移动到任何地方。更令人困惑的是,如果我注释掉动画块中移动 sideView 的行,mainView 的动画就会开始工作。

有谁知道出了什么问题?从我读过的所有搜索和文档中,我所做的应该可以正常工作。我原以为会是一个简单的动画,却变成了数小时的挫败感。任何帮助将非常感激!

编辑:

根据郭路川的建议,我尝试为两个 UIView 的不同属性设置动画。大多数都得到了相同的结果,尽管动画它们的两个变换属性几乎都起作用了。在这种情况下,两个 UIView 都动画了,但是 mainView 只是做错了事:它的动画从不同的位置开始并在错误的位置结束。看起来它正在执行我指示它执行的翻译,但从向量计算中表示的这个位置开始:

starting_point - 0.5 * total_translation

意味着它结束于:

starting_point + 0.5 * total_translation

但是,sideView 的动画效果正确。

这该死的烦人。我没有意识到以这种方式在 iOS 上执行动画是如此糟糕。接下来我要尝试的是使用 CABasicAnimation,虽然我很不高兴,但我不得不尝试使用如此低级的 API 来完成如此简单的事情。

4

4 回答 4

4

我遇到了和你一样的问题。

当我在 中同时设置 2 个视图相同的属性(如frametransform)时UIView animation block,它将无法达到我的预期。

所以,我设置了一个视图frame并设置了另一个视图transform,然后效果很好,但我不知道为什么会这样。

我认为这对你来说会很好。

sideView.hidden = NO;
[UIView animateWithDuration:0.25f
                 animations:^{                         
                     mainView.frame = CGRectMake(200, 0, 320, 460);
                     sideView.transform = CGAffineTransformMakeTranslation(200,0);
                 }];

而且我认为您可以制作 2CABasicAnimation然后将它们添加到CAAnimationGroup. 它也可以为你工作

于 2013-03-17T06:42:49.360 回答
3

问题是我为我的 xib 文件打开了自动调整大小。我一关掉它,我原来的动画代码就完美无缺地工作了。

于 2013-03-18T01:14:49.410 回答
0

如果sideView是 的子视图,请mainView使用以下动画方法:

+animateWithDuration:delay:options:animations:completion:

有选项:

UIViewAnimationOptionAllowAnimatedContent
于 2013-03-17T08:27:49.983 回答
0

我终于找到了解决方案,我认为这非常令人发指。这是有效的代码:

mainView.transform = CGAffineTransformMakeTranslation(400,0);
CABasicAnimation *move = [CABasicAnimation animationWithKeyPath:@"transform.translation.x" ];
[move setFromValue:[NSNumber numberWithFloat:200]];
[move setToValue:[NSNumber numberWithFloat:400]];
[move setDuration:0.25];
move.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
[[mainView layer] addAnimation:move forKey:@"transform.translation.x"];

sideView.center = CGPointMake(100, 230);
CABasicAnimation *sideMove = [CABasicAnimation animationWithKeyPath:@"transform.translation.x" ];
[sideMove setFromValue:[NSNumber numberWithFloat:-200]];
[sideMove setToValue:[NSNumber numberWithFloat:0]];
[sideMove setDuration:0.25];
sideMove.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
[[sideView layer] addAnimation:sideMove forKey:@"transform.translation.x"];

首先,如果我没有设置 mainView 的变换,那么整个事情就不会起作用,并且 mainView 在动画完成后不会移动到任何地方。我尝试设置它的框架和中心,但都没有任何效果。只有变换有效。这个细节类似于使用 animateWithDuration 方法。

其次,这是让我最困惑的部分,为什么数字是这样的?无论出于何种原因,我需要将 mainView 向右偏移 200 个额外像素(sideView 的宽度),以使其正确对齐。如果我不这样做,即使我正在将它的仿射变换从身份更改为向右平移 200 像素,它的动画也会精确到原来的位置。

据我所知,sideView 正在以某种奇怪的方式影响 mainView,即使它们是直接位于我的视图控制器顶层视图下的兄弟姐妹,并且不应该有任何层次关系我的猜测是这与从 xib 加载 sideView 有关,但据我所知,我这样做是正确的。

希望这个解决方案对发现自己处于类似情况的其他人有用,并且他们不必像我刚才那样做同样烦人的死鸡编程。

另外,如果有人可以为所有这些提供解释,我将非常感激!我不喜欢编写我不理解的东西,我很想知道为什么会发生这一切,这样我就可以避免将来出现这种情况。

于 2013-03-17T17:15:14.783 回答