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:
Эта функция используется для создания новой матрицы аффинного преобразования путем добавления значения вращения к существующему аффинному преобразованию. Результирующая структура представляет собой новое аффинное преобразование, которое вы можете использовать (и использовать повторно, если хотите), чтобы вращать систему координат.