我试图在我的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的动画开始工作。
有谁知道什么是错的?从我读过的所有搜索和文档中,我所做的事情都应该正常工作。我认为这将是一个简单的动画已经变成了几个小时的挫折。任何帮助将不胜感激!
编辑:
关于郭禄川的建议我尝试动画两个UIViews的不同属性。大多数都得到了相同的结果,尽管它们的变换属性几乎都有效。在这种情况下,两个UIViews都是动画的,但是mainView只做了错误的事情:它的动画以不同的位置开始,并以错误的位置结束。看起来它正在执行我指示它做的翻译,但是从矢量计算中表示的这个位置开始:
starting_point - 0.5 * total_translation
意思是它结束于:
starting_point + 0.5 * total_translation
然而,sideView正确地动画。
这太可恶了。我没有意识到以这种方式在iOS上执行动画是如此破碎。我接下来要尝试的是使用CABasicAnimation,虽然我不高兴我不得不尝试使用如此简单的低级API。
答案 0 :(得分:4)
我遇到了和你一样的问题。
当我同时设置2个视图相同的属性(例如frame
或transform
)时,在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);
}];
我认为您可以制作2 CABasicAnimation
,然后将其添加到CAAnimationGroup
。它也可以为你工作
答案 1 :(得分:3)
问题是我为我的xib文件启用了自动调整大小。一旦我关闭它,我的原始动画代码就完美无缺。
答案 2 :(得分:0)
如果sideView
是mainView
的子视图,请使用以下动画方法:
+animateWithDuration:delay:options:animations:completion:
带选项:
UIViewAnimationOptionAllowAnimatedContent
答案 3 :(得分: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,即使它们直接在我的视图控制器的顶层视图下是 siblings ,并且不应该有任何类型的层次关系。我的猜测是这与从xib加载sideView有关,但据我所知,我正在这样做。
希望这个解决方案对于发现自己处于类似情况的其他人来说非常有用,而且他们不必像我刚才那样烦人的死鸡编程。
另外,如果有人能提供所有这些的解释,我将非常感激!我不喜欢编码我不理解的东西,我很想知道为什么所有这些都发生了所以我可以避免将来这样的情况。