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

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

Я пытаюсь создать аналоговые часы для своего 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

person user2738907    schedule 29.10.2013    source источник


Ответы (2)


Вращения вокруг центра круга требуют начального преобразования для смещения границ, поэтому преобразование находится в центре круга. Вы обязательно найдете пример кода на этом сайте. Я настоятельно рекомендую вам создать проект с одним представлением, добавить в него цветной квадратный вид и поэкспериментировать, чтобы заставить его правильно вращаться. Только потом берите этот код и интегрируйте в свой реальный проект.

person David H    schedule 29.10.2013
comment
Это экспериментальный проект, но что вы имеете в виду под вращением вокруг центра круга, требующим начального преобразования для смещения границ? - person user2738907; 29.10.2013
comment
Итак, я попробовал это с прямоугольником UIIMage, и похоже, что изображение идет по земле, как куб, падающий. Но я не изменил привязку. - person user2738907; 29.10.2013
comment
Попробуйте сначала только с UIView — создайте его с размером 100x100, установите для него красный фон, а затем попробуйте повернуть его. Есть куча примеров, как это сделать - поищите (напомню) в документе Apple Core Animation, но на 100% наверняка сможете их найти. Если вы просто не хотите, чтобы вас беспокоили, установите награду в 100 баллов за свой вопрос, вы получите больше кода, чем сможете прочитать. - person David H; 29.10.2013
comment
Спасибо всем за помощь. Решенная проблема: для раскадровки есть опция «Использовать автомакет». Вот как это отключить: stackoverflow.com/questions/ 13694972/ - person user2738907; 29.10.2013

Преобразования являются кумулятивными, поэтому вам нужно только добавлять добавочные изменения на каждом тике:

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:

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

person ryan cumley    schedule 29.10.2013
comment
Эта последовательность может показаться яснее, если я напишу ее так {1, 2+1, 3+(2+1), 4+(3+2+1), 5+(4+3+2+1)... } или чистый способ написать это будет n!mod(60), который, конечно, выглядел бы здесь намного лучше, если бы я знал, как использовать LaTeX в stackoverflow... - person ryan cumley; 29.10.2013
comment
Хорошо, я понимаю, проблема в том, что pointerImage ничего не делает. Он стоит в одной и той же точке без какого-либо вращения - person user2738907; 29.10.2013
comment
Итак, есть проблема с UIImageView, я попробовал его с меткой, и он начал вращаться, но движется не в ту сторону. Он не движется вокруг центра, он крутится вверх, вниз в любом направлении... - person user2738907; 29.10.2013
comment
CALayer имеет свойство anchorPoint, которое по умолчанию обычно находится в верхнем левом углу (0.0, 0.0). Если вы можете переместить его в центр вашего вращающегося объекта, все должно работать намного лучше. Что касается направления вращения, просто инвертируйте знак (*-1). Знаки перевернуты для OSX и iOS - person ryan cumley; 29.10.2013
comment
Вы правы, я попробовал это с другим проектом и UISlider, и вращение было похоже на первое. Я не знаю, где это изменить. - person user2738907; 29.10.2013
comment
Не у всех есть CALayer, с которым вы можете играть, но если объект, который вы пытаетесь повернуть, имеет (например, простой UIView), вы можете получить доступ к точке привязки с помощью ‹code›someView.layer.anchorPoint‹/code› - person ryan cumley; 29.10.2013
comment
Но точка ‹code› image.layer.anchorPoint ‹code› по умолчанию равна (0,5, 0,5), поэтому я попробовал это self.image.layer.anchorPoint = CGPointMake(0,5, 0,5); и вращение осталось прежним. Я также пробовал (1,1) и (0,0) не идеальное вращение вокруг центра. Может быть, они изменили его с iOS 7 - person user2738907; 29.10.2013
comment
Можете ли вы опубликовать код того, как вы настраиваете объект, который пытаетесь повернуть? - person ryan cumley; 29.10.2013
comment
Нет, я не могу, мне нужно 10 (что-то) для публикации фотографий... могу я отправить их вам? - person user2738907; 29.10.2013
comment
Это вид UIIMage: изображение не выбрано, ничего не выделено, режим просмотра — по центру, тег = 0, взаимодействие отключено, альфа = 1, фон = оранжевый, оттенок = синий, рисунок выбран (непрозрачный, очищает графический контекст, автоматическое изменение размера подвидов) другие отключены, Растяжка x = 0, y = 0, Ширина = 1, Высота = 1 - person user2738907; 29.10.2013
comment
Я попытался перенести это обсуждение в чат, но та же проблема с вашей репутацией... контактная информация находится на ryancumley dot com. - person ryan cumley; 29.10.2013
comment
Отправила фото по скайпу - person user2738907; 29.10.2013