如何在没有跳过的情况下在特定锚点处旋转图层?

Posted

技术标签:

【中文标题】如何在没有跳过的情况下在特定锚点处旋转图层?【英文标题】:How to rotate an layer at a specific anchor point without a skip? 【发布时间】:2012-03-27 14:13:15 【问题描述】:

我想在左上角而不是中心旋转带有图像的图层。根据文档,我将 anchorPoint 属性设置为 [0, 1]。在我的示例中,视图旋转了 50°,但在它开始动画之前,视图会跳转到屏幕上的另一个点。

self.shakeTag.layer.anchorPoint = CGPointMake(0.0f, 1.0f);
[UIView beginAnimations:@"rotate" context:nil];
[self.shakeTag.layer setTransform:
  CATransform3DRotate(CATransform3DIdentity,
  radians(50.0), 0.0f, 0.0f, 1.0f)];
[UIView commitAnimations];

radians() 是这样定义的:

static inline double radians (double degrees) return degrees * M_PI/180;

当我使用 4 倍大小且有很多透明像素的图像时,我可以将其旋转到默认锚点 [0.5, 0.5],但我不想将空间浪费在不可见像素上.有什么想法可以在旋转发生之前防止图层跳跃吗?

【问题讨论】:

如果你认为答案是正确的,如果你接受那就太棒了。 你需要在这里看到我的答案:***.com/a/22188420/550393 【参考方案1】:

更改锚点会影响视图的定位。如果您更改锚点并且想要将视图保持在当前位置,则需要更改视图的位置。使用这样的东西(取自这里:Layer Position jumps at start of (Core) Animation)来设置你的锚点并补偿位置变化:

-(void)setAnchorPoint:(CGPoint)anchorPoint forView:(UIView *)view

    CGPoint newPoint = CGPointMake(view.bounds.size.width * anchorPoint.x, view.bounds.size.height * anchorPoint.y);
    CGPoint oldPoint = CGPointMake(view.bounds.size.width * view.layer.anchorPoint.x, view.bounds.size.height * view.layer.anchorPoint.y);

    newPoint = CGPointApplyAffineTransform(newPoint, view.transform);
    oldPoint = CGPointApplyAffineTransform(oldPoint, view.transform);

    CGPoint position = view.layer.position;

    position.x -= oldPoint.x;
    position.x += newPoint.x;

    position.y -= oldPoint.y;
    position.y += newPoint.y;

    view.layer.position = position;
    view.layer.anchorPoint = anchorPoint;

更多详情请参见此处:Changing my CALayer's anchorPoint moves the view

【讨论】:

以上是关于如何在没有跳过的情况下在特定锚点处旋转图层?的主要内容,如果未能解决你的问题,请参考以下文章

HTML做的网页 如何使当前页面跳转到另一页面锚点处,在线等!!

如何在没有初始化和特定数量元素的情况下在 Kotlin 中创建对象数组?

如何在没有安装 MQTT 应用程序的设备的情况下在 android 上使用 MQTT 将消息推送到特定 IP?

如何在没有下载的情况下在离子应用程序中显示pdf文件

如何在没有 root 权限的情况下在图像文件上安装 grub?

如何多次围绕锚点旋转视图