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

用递归算法实现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地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AI阅读 16,022评论 3 119
  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,671评论 8 265
  • 去年年底就有叫嚣着A股的慢牛又来了。周边研究股市的老股民都在说现在是进入股市的最佳时期。 我想写写第一次买股的经历...
    ann婉安阅读 340评论 0 0
  • 极简生活,很向往的一种生活状态。 人的一生总是有太多的不舍,却很少去探究其不舍得实质意义。搁置不用的物品太多太多,...
    媚吉阅读 193评论 0 0
  • 願望:1願望電單車可以一次過順利過關完成!2願望有橫財收入!我願望有新對象!感恩:1感恩阿根廷絕殺出線!2感恩等了...
    謝奕鋒阅读 143评论 0 0