使用UINavigationController和UINavigationBar时,图层y位置的动画错误

use*_*977 2 uinavigationbar uinavigationcontroller ios facebook-pop

我像往常一样设置和自定义UINavigationController's导航栏viewWillAppear:.然后我以0.6的间隔进行NSTimer射击viewDidLoad.此计时器触发我的动画代码.

我正在使用Facebook的POP框架,我想要做的就是使用以下代码稍微改变图层的y位置并弹回一点:

// Move object up
POPSpringAnimation *positionAnimation = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerPositionY];
positionAnimation.toValue = @(self.myView.frame.origin.y - 5);
positionAnimation.springBounciness = 20;
positionAnimation.velocity = @(2000);
[self.myView.layer pop_addAnimation:positionAnimation1 forKey:@"positionAnimation"];
Run Code Online (Sandbox Code Playgroud)

出于某种原因,这总是会导致视图位于下方UINavigationBar.如果我切换到以下代码,视图将转到正确的位置:

POPSpringAnimation *frameAnimation = [POPSpringAnimation animation];
frameAnimation.property = [POPAnimatableProperty propertyWithName:kPOPViewFrame];
frameAnimation.toValue = [NSValue valueWithCGRect:CGRectMake(12, 24, 91, 116)];
[self.myView.layer pop_addAnimation:secondFrameAnimation forKey:@"frameAnimation"];
Run Code Online (Sandbox Code Playgroud)

问题是,如果我尝试向frameAnimation使用该velocity属性添加任何反弹,应用程序崩溃,我收到以下错误:

'Invalid value', reason: '2000 should be of type CGRect'
Run Code Online (Sandbox Code Playgroud)

如果我将我的positionAnimation代码放入一个不使用UINavigationController导航栏的新项目中,一切正常,视图会动画到正确的y位置.唯一的另一个区别是我当前的项目是从一个nib/xib文件加载这个视图,但一切都是在新的项目中以编程方式完成的.我不确定这与它有什么关系.

那么如何使用带导航栏的导航控制器,还能成功使用位置动画?

编辑:

我现在让动画正常工作,但仍然遇到一些非常奇怪的行为.以下是成功移动视图而不是将其置于以下位置的代码UINavigationBar:

    // Fade in
    POPSpringAnimation *opacityAnimation = [POPSpringAnimation animation];
    opacityAnimation.property = [POPAnimatableProperty propertyWithName:kPOPLayerOpacity];
    opacityAnimation.toValue = @(1.0);
    [self.design.layer pop_addAnimation:opacityAnimation forKey:@"opacityAnimation"];

    // Move object up
    POPSpringAnimation *positionAnimation1 = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerPositionY];
    positionAnimation1.toValue = @(self.design.frame.origin.y - 10);
    positionAnimation1.springBounciness = 15;
    positionAnimation1.velocity = @(2000);
    [self.design.layer pop_addAnimation:positionAnimation1 forKey:@"positionAnimation"];
    [positionAnimation1 setCompletionBlock:^(POPAnimation *anim, BOOL success) {
        //
        NSLog(@"design frame: %@", NSStringFromCGRect(self.design.frame));

    }];
Run Code Online (Sandbox Code Playgroud)

这是奇怪的.当上述动画的完成块触发时,帧会记录如下:

design frame: {{12, 36}, {91, 116}}
Run Code Online (Sandbox Code Playgroud)

那是对的.但是,如果我改变位置动画的下一行并且只是切换y值36,那么它再次在下面的中间结束UINavigationBar:

positionAnimation1.toValue = @(36);
Run Code Online (Sandbox Code Playgroud)

那么为什么我在使用y值为36时会得到一个糟糕的结果呢?如果我使用的y值self.design.frame.origin.y - 10最终为36,为什么它会起作用呢?

com*_*ial 6

动画kPOPLayerPositionY控制图层中心位置的y值,而不是帧的原点.以下应该有效:

positionAnimation1.toValue = @(36 + 116 * 0.5);
Run Code Online (Sandbox Code Playgroud)

对于前面提到的带有速度的错误,这是因为velocity参数中的组件数必须与要设置动画的属性中的组件数相匹配.因此,如果要为CGRect设置动画,则需要将CGRect传递给速度,其中每个分量都是相应组件的速度.