同步 CCLayer 和 UIView 动画

Posted

技术标签:

【中文标题】同步 CCLayer 和 UIView 动画【英文标题】:Synchronising the CCLayer & UIView animation 【发布时间】:2013-05-14 06:04:36 【问题描述】:

我在 CCLayer 上添加了一个 tableView 作为子视图到 [[CCDirector sharedDirector]view]。然后我分别使用以下代码为 CCLayertableView 设置了动画:

此代码将 CCLayer 左右移动

-(void)moveHomeScreenLayerWithIsAnimated:(BOOL)_isAnimationRight

    if (!_isAnimationRight) 
        [mHomeLayer runAction:[CCSequence actionOne:[CCDelayTime actionWithDuration:0.0f]   two:[CCMoveTo actionWithDuration:0.4f position:ccp((size.width/4)*3, 0)]]];
    
    else
        [mHomeLayer runAction:[CCSequence actionOne:[CCDelayTime actionWithDuration:0.0f] two:[CCMoveTo actionWithDuration:0.4f position:ccp(0, 0)]]];
    

对于tableView的动画

-(void)ViewAnimationRight

    [UIView cancelPreviousPerformRequestsWithTarget:self];
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.4f];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

    tableViewHome.frame = CGRectMake(size.width - size.width/4,topBar.contentSize.height, size.width, size.height);
    [tableViewHome setScrollEnabled:NO];

    [UIView commitAnimations ];


-(void)ViewAnimationLeft
    [UIView cancelPreviousPerformRequestsWithTarget:self];
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.4f];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

    tableViewHome.frame = CGRectMake(0, topBar.contentSize.height, size.width, size.height);
    [tableViewHome setScrollEnabled:YES];

    [UIView commitAnimations ];

CCLayer 和 tableView 都有动画,但它们的动画不同步。动画持续时间不匹配。有没有其他办法。感谢大家的帮助。

【问题讨论】:

【参考方案1】:

尝试将调用同步到调用位置的两个函数。确保调用之间没有繁重的代码来增加延迟。这可能会对您有所帮助。

【讨论】:

【参考方案2】:

试试这个:

首先在 uiview 的 x 位置设置 320

//right to left animation
CGRect basketTopFrame = basketTop.frame;
basketTopFrame.origin.x = 0;
[UIView animateWithDuration:0.3 delay:0.0 options:UIViewAnimationOptionCurveEaseIn animations:^ basketTop.frame = basketTopFrame;  completion:^(BOOL finished) 
];

//left to right animation
CGRect napkinBottomFrame = basketTop.frame;
napkinBottomFrame.origin.x = 320;
[UIView animateWithDuration:0.3 delay:0.0 options: UIViewAnimationOptionCurveEaseOut animations:^ basketTop.frame = napkinBottomFrame;  completion:^(BOOL finished) 

    /*done*/
];

basketTop 是你的 uiview 的一个对象

【讨论】:

我已尝试实现您的代码,但它对我不起作用。【参考方案3】:

可靠地实现同步运动的唯一方法是不使用动作和 ui 动画。他们只是工作方式太不同了。

改为以计划的更新方法手动更新图层和视图位置。检查移动操作代码,了解如何确保在给定时间内到达某个位置。

【讨论】:

以上是关于同步 CCLayer 和 UIView 动画的主要内容,如果未能解决你的问题,请参考以下文章

UIView 动画与子视图同步

同步 UIView 动画

在父 cclayer 内裁剪多个 cclayer

在 iOS7 中边缘滑动时,使键盘与 UIView 同步动画

iOS - 使用自动布局执行多个同步动画

错误更改 CCScene