Objective-C CGAffineTransformRotate не работает

Эй, нужна твоя помощь,

Я пытаюсь создать аналоговые часы для моего iPhone. Проблема в том, что UIImage не движется в правильном направлении или не движется, в большинстве случаев он вращается по всему View. Отсутствуют ли какие-либо рамки, я конвертировал градусы в радианы... Вот код:

#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

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:

Эта функция используется для создания новой матрицы аффинного преобразования путем добавления значения вращения к существующему аффинному преобразованию. Результирующая структура представляет собой новое аффинное преобразование, которое вы можете использовать (и использовать повторно, если хотите), чтобы вращать систему координат.

Другие вопросы по тегам