【问题标题】:Objective-C CGAffineTransformRotate does not workObjective-C CGAffineTransformRotate 不起作用
【发布时间】:2013-10-29 12:14:55
【问题描述】:

嘿,需要你的帮助,

我正在尝试为我的 iPhone 创建一个模拟时钟。 问题是,UIImage 没有以正确的方式移动或没有 移动,大多数时候它在整个视图中旋转。是否缺少任何框架, 我将度数转换为弧度... 这是代码:

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    // Getting a Timer
    NSTimer *timer = [[NSTimer alloc]init];
    timer = [NSTimer scheduledTimerWithTimeInterval: 1 target:self
                                           selector:@selector(tick:) userInfo:nil repeats:YES];
    [timer fire];
    self.ticker = 0;
    self.minutes = 0;
    self.hours = 0;
}

- (void)tick:(NSTimer *)theTimer
{
    //Turning Seconds into Minutes and Hours
    self.ticker ++;
    self.timerLabel.text = [NSString stringWithFormat:@"%d",self.ticker];
    self.seconds = self.ticker;
    if (self.seconds == 60){
        self.ticker = 0;
        self.seconds = 0;
        self.minutes ++;
    }
    if (self.minutes == 60){
        self.minutes = 0;
        self.hours ++;
    }

    //Main issue here...
    // 360° / 60 second = 6° per second
    double grad = self.ticker * 6;
    //Converting Grad into Rad
    double rad = M_PI * grad / 180;
    //Set Transformation ---> CGAffineTransformMakeRotation does not work eighter
    CGAffineTransform transform = CGAffineTransformRotate(self.pointerImage.transform, rad);
    //Set Transformation to UIImageView caleld pointerImage
    self.pointerImage.transform = transform;
    //self.pointerImage.center = CGPointMake(160, 420);
    //NSLog(@"%f", grad);



    if ( self.ticker == 60){
        self.ticker = 0;
    }

}


- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

【问题讨论】:

    标签: ios objective-c image-rotation


    【解决方案1】:

    围绕圆心的旋转需要初始变换来偏移边界 - 因此变换位于圆心。您一定会在此站点上找到示例代码。我强烈建议您创建一个单视图项目,为其添加一个彩色方形视图,并尝试使其正确旋转。只有这样才能获取该代码并将其集成到您的实际项目中。

    【讨论】:

    • 这是一个实验性项目,但是“围绕圆心旋转需要初始变换以偏移边界”是什么意思
    • 所以,我用 UIIMage Rectangle 进行了尝试,看起来图像在地上行走,就像一个立方体倒下。但我没有改变锚点。
    • 首先尝试只使用一个 UIView - 使用 100x100 创建它,将其背景设置为红色,然后尝试旋转它。有很多示例如何做到这一点 - 查看(我记得)Apple 的核心动画文档,但 100% 肯定你可以找到它们。如果您只是不想被打扰,请在您的问题上悬赏 100 分,您将获得比阅读更多的代码。
    • 感谢大家的帮助。解决了问题:情节提要有一个名为“使用自动布局”的选项。以下是如何禁用它:stackoverflow.com/questions/13694972/…
    【解决方案2】:

    变换是累积的,所以你只需要在每个刻度上添加增量变化:

    CGAffineTransform transform = CGAffineTransformRotate(self.pointerImage.transform, (M_PI * 6 / 180));
    

    正如你所拥有的那样,你的时钟指针每跳 {1,3,6,10,15,21,28,36,45,55,6,18,31...} 这就是为什么它似乎跳来跳去。

    CGAffineTransform 类参考中的相关行如下,取自 CGAffineTransformRotate 方法定义:

    您可以使用此函数通过向现有仿射变换添加旋转值来创建新的仿射变换矩阵。生成的结构表示一个新的仿射变换,您可以使用(如果需要,可以重复使用)来旋转坐标系。

    【讨论】:

    • 如果我把它写成这样 {1, 2+1, 3+(2+1), 4+(3+2+1), 5+(4+3 +2+1)...} 或者纯粹的编写方式是 n!mod(60) 如果我知道如何在 stackoverflow 中使用 LaTeX,这当然会更好看...
    • 好的,我明白了,问题在于指针图像什么也没做。它站在同一点没有任何旋转
    • 所以 UIImageView 有问题,我用标签尝试过它并开始旋转,但它的移动方式错误。它不会绕着中心移动,它会在任何方向向上、向下旋转......
    • CALayer 有一个“anchorPoint”属性,通常默认为左上角 (0.0, 0.0) 如果你可以将它移动到旋转对象的中心,事情应该会更好。至于旋转方向,只需反转符号(*-1)。 OSX 和 iOS 的标志已翻转
    • 你是对的,我在另一个项目和一个 UISlider 中尝试过,旋转与第一个相似。我不知道在哪里改变它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    • 2015-10-23
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多