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,为什么它会起作用呢?
动画kPOPLayerPositionY控制图层中心位置的y值,而不是帧的原点.以下应该有效:
positionAnimation1.toValue = @(36 + 116 * 0.5);
Run Code Online (Sandbox Code Playgroud)
对于前面提到的带有速度的错误,这是因为velocity参数中的组件数必须与要设置动画的属性中的组件数相匹配.因此,如果要为CGRect设置动画,则需要将CGRect传递给速度,其中每个分量都是相应组件的速度.
| 归档时间: |
|
| 查看次数: |
708 次 |
| 最近记录: |