Проблема с вращающейся тактовой иглой

Я новичок в 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 = @"termine";
    }
}

-(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

objective-c,iphone,

2

Ответов: 4


2

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

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


0

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

CAPropertyAnimation имеет кумулятивный и аддитивный


0

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

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

Поэтому постарайтесь:

spinAnimation.byValue = M_PI/6;

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

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

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

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

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

float cranTest = 3.1415279f;

0

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

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

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

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

Objective-C, iphone,
Похожие вопросы