登录 立即注册
金钱:

Code4App-iOS开发-iOS 开源代码库-iOS代码实例搜索-iOS特效示例-iOS代码例子下载-Code4App.com

iOS滚珠菜单动效

来自: 熊熊xr 分类: iOS精品源码 上传时间: 2016-7-5 08:44:43
Tag:动画 animation 效果 CAAnimation UIDynamic

项目介绍:

原型从网上找的,动效使用了CAAnimation和UIDynamic物理引擎。  gitHub  

大致步骤如下:

  • 把效果图截取一张,拖到Sketch做背景
  • 新建图层,使用钢笔工具临摹背景图勾勒出路径
  • 注意:勾勒时可以选择非镜像的控制点,这样方便调整曲线


接着点击Sketch右下角的倒出按钮,格式选为SVG格式


将生成的SVG文件拖入到codePaint中,拖入成功后会直接看到如下界面

看到代码路径后可以整段copy出来,当然,我建议把所有的点抽离出来,方便做适配

代码绘制凹槽动画

demo的AppDelegate.h中有以下这些开关,可以自己调配,方便观察


单个滚珠动效演示,这样看应该比较容易理解。其实我是盖了一个新的图层专门用来做滚珠动效的。
控制点就是用普通的UIAniamtion实现的,在动画之行的过程中,通过CADisplayLink实时观察Point的PresentLayer的position来不停的重绘贝塞尔曲线。

2.滚珠动画该分解成几个步骤
主要分为以下步骤
阶段一:滚珠一起滚落下来时到最高点的阶段;
阶段二:滚珠滚落到最高点后回流的的阶段;
阶段三:滚珠消失阶段;
3.如何分解滚珠的物理效果

UIDynamic有以下物理效果

  • UIGravityBehavior:重力行为
  • UICollisionBehavior:碰撞行为
  • UISnapBehavior:捕捉行为
  • UIPushBehavior:推动行为
  • UIAttachmentBehavior:附着行为
  • UIDynamicItemBehavior:动力元素行为

UIGravityBehavior:重力行为
[Objective-C] 查看源文件 复制代码
#pragma mark  重力行为
- (UIGravityBehavior *)addGravityBehavior:(id <UIDynamicItem>)item
{
    UIGravityBehavior *gravityBehavior = [[UIGravityBehavior alloc] init];
    [gravityBehavior addItem:item];
    [_animator addBehavior:gravityBehavior];

    return gravityBehavior;
}



UICollisionBehavior:碰撞行为

适用于:UIView和父类view的边界碰撞,以及和其他UIView碰撞
这里可以配合重力行为来设定小球的运动路径

[Objective-C] 查看源文件 复制代码
#pragma mark  碰撞行为
- (UICollisionBehavior *)addCollisionBehavior:(id <UIDynamicItem>)item
{
    UICollisionBehavior *collisionBehavior = [[UICollisionBehavior alloc] init];
    [collisionBehavior addItem:item];
    [collisionBehavior addBoundaryWithIdentifier:@"path" forPath:_beizerPath];
    [_animator addBehavior:collisionBehavior];

    return collisionBehavior;
}




UISnapBehavior:捕捉行为

顾名思义,不解释

UIPushBehavior:推动行为
使用瞬间或持续的力并按照某一方向作用于某个UIView
用于开始或结束时的小球推动

[Objective-C] 查看源文件 复制代码
#pragma mark  显现动画,第一个球向右的推力
- (UIPushBehavior *)addPushBehavior_inFirstBtn
{
    UIButton *tempBtn = _btnArray[0];
    UIPushBehavior *pushBehavior = [[UIPushBehavior alloc] initWithItems:@[tempBtn] mode:UIPushBehaviorModeInstantaneous];
    pushBehavior.pushDirection = CGVectorMake(1, 0.3);
    pushBehavior.magnitude = 1.6;
    [_animator addBehavior:pushBehavior];

    return pushBehavior;
}



UIAttachmentBehavior:附着行为

UIView和某个UIView的相互吸附行为
此处用于小球见的相互吸附作用

[Objective-C] 查看源文件 复制代码
#pragma mark  添加球与球之间的附着行为
- (UIAttachmentBehavior *)addAttachmentBehavior_item:(id <UIDynamicItem>)item attachToItem:(id <UIDynamicItem>)attachToItem
{
    SpecialBtn *tempBtn = (SpecialBtn *)item;

    UIAttachmentBehavior *attachmentBehavior = [[UIAttachmentBehavior alloc] initWithItem:item attachedToItem:attachToItem];
    [attachmentBehavior setLength:tempBtn.width + 20];
    [attachmentBehavior setDamping:10.01];
    [attachmentBehavior setFrequency:1];
    [_animator addBehavior:attachmentBehavior];

    return attachmentBehavior;
}



UIDynamicItemBehavior:动力元素行为

一些其他的物理元素,比如摩擦力,线速度阻力,角速度阻力等

[Objective-C] 查看源文件 复制代码
#pragma mark  动力元素行为
- (UIDynamicItemBehavior *)addDynamicItemBehavior:(id <UIDynamicItem>)item
{
    UIDynamicItemBehavior *itemBehavior = [[UIDynamicItemBehavior alloc] initWithItems:@[item]];
    itemBehavior.resistance = 0;
    itemBehavior.allowsRotation = YES;
    itemBehavior.angularResistance = 4.0;
    itemBehavior.friction = 0.8;
    [_animator addBehavior:itemBehavior];

    return itemBehavior;
}



阶段一:滚珠一起滚落下来时到最高点的阶段球与球之间的附着行为 + 重力行为+碰撞行为+ 动力元素行为+ 第一个球向右的推力#pragma mark 显现动画
[Objective-C] 查看源文件 复制代码
#pragma mark 显现动画
- (void)showBtnsAnimation
{
    _animatorStatus = kAnimatorStatus_open;
    [_animator removeAllBehaviors];

    if (showPath) {
        _pathLayer.path = _beizerPath.CGPath;
        _pathLayer.fillColor = [UIColor clearColor].CGColor;
        _pathLayer.strokeColor = [UIColor orangeColor].CGColor;
        _pathLayer.lineWidth = 2.0;
        [self.layer addSublayer:_pathLayer];
    }

    CGFloat btn_gap = [self setXX:16];
    for (int i = 0; i < [_btnArray count]; i++) {

        SpecialBtn *tempBtn = _btnArray[i];
        tempBtn.tag = i;
        [self addSubview:tempBtn];

        //  设定初始位置
        [tempBtn setX:(tempBtn.width + btn_gap) * ([_btnArray count] - 1 - i) + btn_gap];
        [tempBtn setY:-tempBtn.height];

        //  添加球与球之间的附着行为
        if (i > 0) {
            [self addAttachmentBehavior_item:_btnArray[i] attachToItem:_btnArray[i - 1]];
        }

        //  重力行为
        UIGravityBehavior *gravityBehavior = [self addGravityBehavior:tempBtn];
        if (i == [_btnArray count] - 1) {
            //  最后一个球处理重力行为
            [self dealLastBtnGravityBehavior:gravityBehavior tempBtn:tempBtn];
        }

        //  碰撞行为
        [self addCollisionBehavior:tempBtn];

        //  动力元素行为
        UIDynamicItemBehavior *itemBehavior = [self addDynamicItemBehavior:tempBtn];
        if (i == [_btnArray count] - 1) {
            //  最后一个球增加密度,以防止出现的时候,由于惯性的原因导致飞起来
            itemBehavior.density = 1.8;
        }

    }

    //  第一个球向右的推力
    [self addPushBehavior_inFirstBtn];
}




阶段二:滚珠滚落到最高点后回流的的阶段球与球之间的附着行为 + 重力行为+碰撞行为+ 动力元素行为+ 最后一个球向左pushf
[Objective-C] 查看源文件 复制代码
for (int i = 0; i < [_btnArray count]; i++) {

                    //  添加球与球之间的附着行为
                    if (i > 0) {

                        UIAttachmentBehavior *attachmentBehavior = [self addAttachmentBehavior_item:_btnArray[i] attachToItem:_btnArray[i - 1]];
                        [attachmentBehavior setFrequency:5];
                        [attachmentBehavior setLength:tempBtn.width + 5];
                    }

                    //  重力行为
                    [self addGravityBehavior:_btnArray[i]];

                    //  碰撞行为
                    [self addCollisionBehavior:_btnArray[i]];

                    //  动力元素行为
                    UIDynamicItemBehavior *itemBehavior = [self addDynamicItemBehavior:_btnArray[i]];
                    itemBehavior.angularResistance = 15.0;
                }

                //  最后一个球向左push
                UIPushBehavior *pushBehavior = [[UIPushBehavior alloc] initWithItems:@[tempBtn] mode:UIPushBehaviorModeContinuous];
                pushBehavior.pushDirection = CGVectorMake(-1, -0.5);
                pushBehavior.magnitude = 2.3;
                [_animator addBehavior:pushBehavior];






阶段三:滚珠消失阶段球与球之间的附着行为 + 重力行为+碰撞行为+ 动力元素行为+ 最后一个球向左push(和阶段二几本一致,只是推动的力大了一些)

[Objective-C] 查看源文件 复制代码
#pragma mark 消退动画
- (void)closeBtnsAniamtion
{
    NSLog(@"-- closeBtnsAniamtion");

    _animatorStatus = kAnimatorStatus_close;
    SpecialBtn *lastBtn = (SpecialBtn *)[_btnArray lastObject];

    [_animator removeAllBehaviors];

    for (int i = 0; i < [_btnArray count]; i++) {

        //  添加球与球之间的附着行为
        if (i > 0) {

            UIAttachmentBehavior *attachmentBehavior = [self addAttachmentBehavior_item:_btnArray[i] attachToItem:_btnArray[i - 1]];
            [attachmentBehavior setFrequency:5];
            [attachmentBehavior setLength:lastBtn.width + 5];
        }

        //  重力行为
        UIGravityBehavior *gravityBehavior = [self addGravityBehavior:_btnArray[i]];
        if (i == 0) {
            [self dealFirstDisappearBtnGravityBehavior:gravityBehavior tempBtn:_btnArray[i]];
        }

        //  碰撞行为
        [self addCollisionBehavior:_btnArray[i]];

        //  动力元素行为
        [self addDynamicItemBehavior:_btnArray[i]];
    }

    //  最后一个球向左push
    UIPushBehavior *pushBehavior = [[UIPushBehavior alloc] initWithItems:@[lastBtn] mode:UIPushBehaviorModeContinuous];
    pushBehavior.pushDirection = CGVectorMake(-1, -0.5);
    pushBehavior.magnitude = 10.0;
    [_animator addBehavior:pushBehavior];
}



本示例DEMO下载:



相关源码推荐:

我来说两句
*滑动验证:
所有评论(256)
半吱湮 2016-7-5 10:57:02
很给力,Code4App有你更精彩!
回复
zhao3031461 2016-7-5 11:26:45
我只是路过打酱油的。
回复
nslogin 2016-7-5 11:40:38
精华内容,楼主V5!
回复
az1387088 2016-7-5 11:54:37
可以,这个效果很不错 准备下来看
回复
az1387088 2016-7-5 11:54:58
淡定,淡定,淡定……
回复
feng520ckx 2016-7-5 11:58:43
非常棒!赞一个~
回复
az1387088 2016-7-5 12:01:38
我只是路过打酱油的。
回复
caibde 2016-7-5 13:47:37
精华内容,楼主V5!
回复
bensco 2016-7-5 14:00:55
楼主用心了,内容非常精彩。
回复
提取码:  下载次数:215 状态:已购或VIP 售价:0(原价:10)金钱 下载权限:初级码农 
23580 6 215
联系我们
首页/微信公众账号投稿

帖子代码编辑/版权问题

QQ:435399051,742864542

如何获得代码达人称号?

代码贡献英雄榜
用户名 下载数
通过邮件订阅最新 Code4App 信息
上一条 /4 下一条
联系我们
关闭
合作电话:
13802416937
Email:
435399051@qq.com
商务市场合作/投稿
问题反馈及帮助
联系我们

广告投放| Github|申请友链|手机版|Code4App ( 粤ICP备15117877号-1 )

快速回复 返回顶部 返回列表