iOS面试题:当我们要做一些基于 CALayer 的动画时,有时需要设置 layer 的锚点来配合动画,这时候我们需要注意什么?

需要注意的是设置锚点会引起原来 position 的变化,可能会发生不符合预期的行为,所以要做一下转化,示例代码如下:

    // 为 layer 的动画设置不同的 anchor point,但是又不想改变 view 原来的 position,则需要做一些转换。
    - (void)setAnchorPoint:(CGPoint)anchorPoint forView:(UIView *)view {
        // 分别计算原来锚点和将更新的锚点对应的坐标点,这些坐标点是相对该 view 内部坐标系的。
        CGPoint oldPoint = CGPointMake(view.bounds.size.width * view.layer.anchorPoint.x,
                                       view.bounds.size.height * view.layer.anchorPoint.y);
        CGPoint newPoint = CGPointMake(view.bounds.size.width * anchorPoint.x,
                                       view.bounds.size.height * anchorPoint.y);
        
        // 如果当前 view 有做过 transform,这里要同步计算。
        oldPoint = CGPointApplyAffineTransform(oldPoint, view.transform);
        newPoint = CGPointApplyAffineTransform(newPoint, view.transform);
        
        // position 是当前 view 的 anchor point 在其父 view 的位置。
        CGPoint position = view.layer.position;
        // anchor point 的改变会造成 position 的改变,从而影响 view 在其父 view 的位置,这里把这个位移给计算回来。
        position.x = position.x + newPoint.x - oldPoint.x;
        position.y = position.y + newPoint.y - oldPoint.y;
        
        view.translatesAutoresizingMaskIntoConstraints = YES;
        view.layer.anchorPoint = anchorPoint; // 设置了新的 anchor point 会改变位置。
        view.layer.position = position; // 通过在 position 上做逆向偏移,把位置给移回来。
    }

更多:iOS面试题合集

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

推荐阅读更多精彩内容

  • 1 CALayer IOS SDK详解之CALayer(一) http://doc.okbase.net/Hell...
    Kevin_Junbaozi阅读 10,592评论 3 23
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,825评论 1 32
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 28,109评论 1 45
  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 32,142评论 2 89
  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌。在这里你可以看...
    F麦子阅读 10,532评论 5 13