Пользовательский класс Spinner с проблемой анимации вращения - PullRequest
0 голосов
/ 20 мая 2019

Я запрограммировал свой собственный вид, содержащий изображение, которое должно вращаться.Вот моя анимация вращения:

- (void)startPropeller
{
    //_movablePropeller = [[UIImageView alloc] initWithFrame:self.frame];
    //_movablePropeller.image = [UIImage imageNamed:@"MovablePropeller"];
    //[self addSubview:self.movablePropeller];
    self.hidden = NO;

    CABasicAnimation *rotation;
    rotation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
    rotation.fromValue = [NSNumber numberWithFloat:0.0f];
    rotation.toValue = [NSNumber numberWithFloat:(2 * M_PI)];
    rotation.cumulative = true;
    rotation.duration = 1.2f; // Speed
    rotation.repeatCount = INFINITY; // Repeat forever. Can be a finite number.

    [self.movablePropeller.layer removeAllAnimations];
    [self.movablePropeller.layer addAnimation:rotation forKey:@"Spin"];
}

И вот как я ее запускаю:

self.loadingPropeller = [[FMLoadingPropeller alloc] initWithFrame:self.view.frame andStyle:LoadingPropellerStyleNoBackground];
self.loadingPropeller.center=self.view.center;
[self.view addSubview:self.loadingPropeller];
[self.loadingPropeller startPropeller];

Проблема в следующем: без какого-либо дополнительного кода.Пропеллер не вращается.Так что я смог решить эту проблему, добавив в свой класс следующий код, реализующий вращающийся вращатель пропеллера:

-(void)viewDidAppear:(BOOL)animated
{
    if(!self.loadingPropeller.hidden){
        [self.loadingPropeller startPropeller];
    }
}

Но мне это не очень нравится.Разве нельзя добавить некоторый код в класс Propeller для автоматического решения этой проблемы, не добавляя также код в каждый класс в методе viewDidAppear?

1 Ответ

0 голосов
/ 20 мая 2019

Код, который не работает, выполняет две важные вещи: добавление счетчика в иерархию представления и его позиционирование.Я предполагаю, что сбой происходит из-за его позиционирования до того, как произошла компоновка.Попробуйте это:

// in viewDidLoad of the containing vc...
self.loadingPropeller = [[FMLoadingPropeller alloc] initWithFrame:CGRectZero andStyle:LoadingPropellerStyleNoBackground];
[self.view addSubview:self.loadingPropeller];

// within or after viewDidLayoutSubviews...
// (make sure to call super for any of these hooks)
self.loadingPropeller.frame = self.view.bounds;
self.loadingPropeller.center = self.view.center;

// within or after viewDidAppear (as you have it)...
[self.loadingPropeller startPropeller];
...