Ios 层'的动画错误;使用UINavigationController和UINavigationBar时的y位置

Ios 层'的动画错误;使用UINavigationController和UINavigationBar时的y位置,ios,uinavigationcontroller,uinavigationbar,facebook-pop,Ios,Uinavigationcontroller,Uinavigationbar,Facebook Pop,我在视图中设置并自定义UINavigationController的导航栏,它将像往常一样出现:。然后在viewDidLoad中触发一个NSTimer,时间间隔为0.6。这个计时器触发我的动画代码 我正在使用Facebook的POP框架,我只想使用以下代码稍微更改图层的y位置并稍微反弹: // Move object up POPSpringAnimation *positionAnimation = [POPSpringAnimation animationWithPropertyNamed:

我在
视图中设置并自定义
UINavigationController的导航栏,它将像往常一样出现:
。然后在
viewDidLoad
中触发一个
NSTimer
,时间间隔为0.6。这个计时器触发我的动画代码

我正在使用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"];
出于某种原因,这总是会导致视图位于
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"];
问题是,如果我尝试使用
velocity
属性将任何反弹添加到
frameAnimation
,应用程序将崩溃,并出现以下错误:

'Invalid value', reason: '2000 should be of type CGRect'
如果我将我的
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));

    }];
positionAnimation1.toValue = @(36);
但奇怪的是。当上述动画的完成块激发时,帧记录如下:

design frame: {{12, 36}, {91, 116}}
没错。但是,如果我更改位置动画的下面一行,只需切换y值
36
,它将再次在
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));

    }];
positionAnimation1.toValue = @(36);

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

动画
kPOPLayerPositionY
控制层中心位置的y值,而不是帧上的原点。以下方面应起作用:

positionAnimation1.toValue = @(36 + 116 * 0.5);

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

不知道kPOPLayerPositionY聚焦于中心,而不是帧的原点。谢谢positionAnimation1.toValue=@(self.design.center.y-10);