Проблема с вращающейся часовой стрелкой - PullRequest
2 голосов
/ 16 июня 2009

Я новичок в Objective-C, и я пытаюсь сделать часы. Сейчас я просто тестирую, и моя проблема в том, что для каждой петли стрелка вращается из своего исходного положения, а не из последнего положения. Итак, мой вопрос: как сделать следующий поворот в цикле for из последней позиции, в которой находилась игла?

Помогите мне, пожалуйста, я прохожу стажировку в прошлом учебном году. Вот мой код:

#import "MainView.h"
#include < math.h>

static inline double radians (double degrees) {return degrees * M_PI/180;}

@implementation MainView

int cranTest = 3.1415279;
int tps = 0; 

@synthesize aiguille;
@synthesize tempsEcoule;
@synthesize timer;


- (IBAction)go {
    timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(checkTime) userInfo:nil repeats:YES];
}

-(void)checkTime{
    if(tps < 12){
        [self updateLabel];
        [self tourne];
    }else{
        [timer invalidate];
        tempsEcoule.text = @"terminé";
    }
}

-(void)updateLabel{
    tps += 1;
    tempsEcoule.text = [NSString stringWithFormat:@"%i",tps];
}

-(void)tourne{      
    CABasicAnimation *spinAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
    spinAnimation.fromValue = 0;
    spinAnimation.toValue = [NSNumber numberWithFloat:cranTest];
    spinAnimation.duration = .5;

    [aiguille.layer addAnimation:spinAnimation forKey:@"spinAnimation"];
}

@end

Ответы [ 4 ]

2 голосов
/ 16 июня 2009

Ваш код использует таймер для запуска CAAnimation каждую секунду. Вам лучше использовать свойство repeatCount CAAnimation (из протокола CAMediaTiming), чтобы включить непрерывную анимацию.

Используя кумулятивные или аддитивные свойства, вы можете настроить анимацию для запуска следующего цикла с того места, где последний остановился.

0 голосов
/ 19 июня 2009

Попробуйте сделать это вместо:

spinAnimation.byValue = [NSNumber withFloat:(M_PI/6)];

Я считаю, что это не должно вызывать проблем. И не забудьте внести другие изменения, о которых я вам рассказывал, например, сменив cranTest с int на float.

Также, когда вы отвечаете, не добавляйте ответ, вместо этого добавьте комментарий к ответу. Э-э ... ответ на вопрос об ответе без комментария, без ответа.

0 голосов
/ 18 июня 2009

Я не уверен, у меня нет опыта работы с CoreAnimation, но я считаю, что вам нужно установить свойство byValue :

Определяет значение, которое приемник использует для выполнения относительной интерполяции.

Так что попробуйте:

spinAnimation.byValue = M_PI/6;

Я не уверен, нужно ли вам делать явное приведение к числу с плавающей точкой, поскольку свойство является идентификатором, я также новичок в Objective-C. Поэтому я думаю, что вам нужно сделать:

spinAnimation.byValue = (float)(M_PI/6); // not sure if this is needed or correct

Я не уверен, что вам нужен набор совокупных и аддитивных свойств, попробуйте их закомментировать:

// spinAnimation.cumulative = YES;
// spinAnimation.additive = YES;

И, как сказал Дэвид в комментарии к вашему исходному сообщению, вы должны установить cranTest как число с плавающей точкой вместо целого числа, в противном случае значение будет усечено до 3:

float cranTest = 3.1415279f;
0 голосов
/ 16 июня 2009

CABasicAnimation ( документация здесь ) является подклассом CAPropertyAnimation ( документация здесь )

CAPropertyAnimation имеет накопительную и аддитивную

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...