美文网首页
用递归算法实现iOS补位动画

用递归算法实现iOS补位动画

作者: 迷路的安然和无恙 | 来源:发表于2018-12-02 22:18 被阅读37次

用递归算法实现iOS补位动画

前言

写这个动画,主要是为了运用递归算法。
需求如下:
  • 点击任一个方块,在它之后的方块都向前移动进行补位。
效果如下:
demo.gif
实现思路:
1.创建的方块数要比展示的方块多一个。
2.将被点击的方块的Frame赋给它之后的方块
3.如果被点击的方块之后的方块之后,还有方块,那就把它之后的方块的Frame再赋给它之后的方块的之后的方块。🙂(这样描述晕不晕?)
4.知道最后一个之后在没有方块。
示例:

点击0号方块,1、2、3号方块会自动向前移位。
规律在与步骤2、3。

动画代码:
- (void)action:(UIButton *)button {
    button.hidden = YES;
    [UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
        [self changeFrame:button];
        button.alpha = 0;
    } completion:^(BOOL finished) {
        button.frame = self.rightFrames.lastObject.CGRectValue;
        button.hidden = NO;
        [self reloadTagAndFrame:button];
        [UIView animateWithDuration:0.5 animations:^{
            button.alpha = 1;
        }];
    }];
}

动画效果使用的UIViewUIViewAnimationOptionTransitionCrossDissolve

核心在于Frame的改变,代码如下:

- (void)changeFrame:(UIButton *)button {
    [self frameChange:button tag:button.tag];
}
// 递归更改Frame
- (void)frameChange:(UIButton *)button tag:(NSInteger)tag {
    if (tag == 0) {
        tag++;
    }
    self.rightBtns[tag].frame = self.rightFrames[tag - 1].CGRectValue;
    if (tag < 3 && tag >= 1) {
        tag++;
        [self frameChange:self.rightBtns[tag] tag:tag];
    }
}
其他逻辑注意:
  • 当点击的是第一个时,无需将它前一个的Frame赋值给它,开始从第二个修改Frame即可,递归直到修改到最后一个跳出递归即可。
  • 需要使用两个数组分别保存所创建的方块的Frame值和方块。
  • 在动画结束之后,把被点击的那个方块的Frame修改为最后一个方块的Frame,同时,被点击的方块在数组中的顺序也需要被移动到最后。

Demo地址

相关文章

  • 用递归算法实现iOS补位动画

    用递归算法实现iOS补位动画 前言 需求如下: 点击任一个方块,在它之后的方块都向前移动进行补位。 效果如下: 示...

  • 递归实现 n!

    递归的特点: 自己调用自己 设定终止条件 优点:算法简单缺点:效率低下 用递归实现阶乘 n! 用 for 循环实现...

  • 数据结构与算法二:认识O(NlogN)的排序

    1、递归算法 用递归算法求数组 arr[] 中的最大值 N程序实现: 递归逻辑图解如下图所示: 2、归并排序 归并...

  • ios oc用递归实现冒泡算法

    排序思路: 1 子问题,一趟排序把最大的数排到末尾 2 外层循环控制排序次数,内层循环控制比较次数。外层循环排序次...

  • iOS swift 排列组合 算法

    排列组合的算法有很多,例如递归、穷举,下面我们用位运算的方式来实现全组合的算法 - 原理: 我们以[1, 2, 3...

  • Java递归算法详解

    递归算法是一种直接或者间接调用自身函数或者方法的算法。Java递归算法是基于Java语言实现的递归算法。递归算法的...

  • 递归、回溯、分治

    递归 (1)子集 方式一:递归算法 方式二:位运算算法 (2)子集II 方法一:递归算法 方法二:位运算 (3)组...

  • 单链表递归求平均数

    设计一个算法:实现用递归求单链表的平均数 实现思路 通过递归循环累加,要注意用double类型,避免在递归过程中用...

  • 简单的递归举例

    递归算法用递归的算法求1,1,2,3,5,8.......的第30位数是多少,然后求这些数的和. 代码如下: ...

  • NLog(N)复杂度排序算法小结.md

    归并排序 动画过程演示 算法的基本实现 使用递归的方式,将数据进行分割分割 图解 代码实现 向上进行归并(也就是把...

网友评论

      本文标题:用递归算法实现iOS补位动画

      本文链接:https://www.haomeiwen.com/subject/xbwscqtx.html