gpt4 book ai didi

objective-c - 如何围绕任意点旋转对象?

转载 作者:技术小花猫 更新时间:2023-10-29 11:14:23 25 4
gpt4 key购买 nike

我想以圆形方式而不是直线方式围绕任意点旋转 UILabel。这是我的代码。最终点是完美的,但它穿过初始点和终点之间的直线。

- (void)rotateText:(UILabel *)label duration:(NSTimeInterval)duration degrees:(CGFloat)degrees {
/* Setup the animation */
[UILabel beginAnimations:nil context:NULL];
[UILabel setAnimationDuration:duration];


CGPoint rotationPoint = CGPointMake(160, 236);
CGPoint transportPoint = CGPointMake(rotationPoint.x - label.center.x, rotationPoint.y - label.center.y);

CGAffineTransform t1 = CGAffineTransformTranslate(label.transform, transportPoint.x, -transportPoint.y);
CGAffineTransform t2 = CGAffineTransformRotate(label.transform,DEGREES_TO_RADIANS(degrees));
CGAffineTransform t3 = CGAffineTransformTranslate(label.transform, -transportPoint.x, +transportPoint.y);

CGAffineTransform t4 = CGAffineTransformConcat(CGAffineTransformConcat(t1, t2), t3);
label.transform = t4;

/* Commit the changes */
[UILabel commitAnimations];

}

最佳答案

你应该自己设置anchorPoint

对于真正 anchor 的变化使用关键帧动画是非常矫枉过正的。

anchor 是应用所有变换的起点,默认 anchor 是中心。通过将 anchor 移动到 (0,0),您可以改为让图层从最底角开始旋转。通过将 anchor 设置为 xy 在 0.0 - 1.0 范围之外的位置,您可以让图层围绕位于其边界之外的点旋转。

请阅读关于Layer Geometry and Transforms的部分在 Core Animation Programming Guide 中获取更多信息。 它通过图片详细介绍了这一点,以帮助您理解。


编辑:记住一件事

图层的框架(也是 View 的框架)是使用位置、边界和 anchor 计算的。更改 anchorPoint 将更改您的 View 在屏幕上的显示位置。您可以通过在更改 anchor 后重新设置框架来解决这个问题(这将为您设置位置)。否则,您可以将位置设置为您自己旋转的点。 documentation (linked to above)也提到了这一点。


应用于你的代码

应更新您称为“transportPoint”的点,以计算旋转点与标签左下角除以宽度和高度之间的差值。

// Pseudocode for the correct anchor point
transportPoint = ( (rotationX - labelMinX)/labelWidth,
(rotationX - labelMinY)/labelHeight )

我还将旋转点作为您方法的参数。完整的更新代码如下:

#define DEGREES_TO_RADIANS(angle) (angle/180.0*M_PI)

- (void)rotateText:(UILabel *)label
aroundPoint:(CGPoint)rotationPoint
duration:(NSTimeInterval)duration
degrees:(CGFloat)degrees {

/* Setup the animation */
[UILabel beginAnimations:nil context:NULL];
[UILabel setAnimationDuration:duration];

// The anchor point is expressed in the unit coordinate
// system ((0,0) to (1,1)) of the label. Therefore the
// x and y difference must be divided by the width and
// height of the label (divide x difference by width and
// y difference by height).
CGPoint transportPoint = CGPointMake((rotationPoint.x - CGRectGetMinX(label.frame))/CGRectGetWidth(label.bounds),
(rotationPoint.y - CGRectGetMinY(label.frame))/CGRectGetHeight(label.bounds));

[label.layer setAnchorPoint:transportPoint];
[label.layer setPosition:rotationPoint]; // change the position here to keep the frame
[label.layer setTransform:CATransform3DMakeRotation(DEGREES_TO_RADIANS(degrees), 0, 0, 1)];

/* Commit the changes */
[UILabel commitAnimations];
}

关于objective-c - 如何围绕任意点旋转对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6160519/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com