Цель C: Пользовательский класс вращающегося аниматора в виде пропеллера - PullRequest
0 голосов
/ 10 мая 2019

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

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

Это мой класс загрузочного пропеллера:

@implementation FMLoadingPropeller

/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
    // Drawing code
}
*/

- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        self.hidden = YES;

        _movablePropeller = [[UIImageView alloc] initWithFrame:self.frame];
        _movablePropeller.image = [UIImage imageNamed:@"PropWhite"];
        _movablePropeller.frame = self.frame;

        _fixedPropellerPart = [[UIImageView alloc] initWithFrame:self.frame];
        _fixedPropellerPart.image = [UIImage imageNamed:@"GearringBlue"];
        _fixedPropellerPart.frame = self.frame;

        [self addSubview:_fixedPropellerPart];
        [self addSubview:_movablePropeller];
    }
    return self;
}

- (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"];
}

- (void)stopPropeller
{
    self.hidden = YES;

    [self.movablePropeller.layer removeAllAnimations];
}

@end

И вот как он создается и запускается:

self.loadingPropeller = [[FMLoadingPropeller alloc] initWithFrame:CGRectMake(self.view.center.x, self.view.center.y, 200, 200)];
self.loadingPropeller.center=self.view.center;
[self.view addSubview:self.loadingPropeller];
[self.loadingPropeller startPropeller];

Но ничего не появляется наэкран ...

РЕДАКТИРОВАТЬ: Теперь он появляется на экране, но в самом нижнем правом углу

Ответы [ 2 ]

2 голосов
/ 10 мая 2019

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

Изменить:

_movablePropeller = [[UIImageView alloc] initWithFrame:self.frame];

на:

_movablePropeller = [[UIImageView alloc] initWithFrame:self.bounds];

Также удалить строку:

_movablePropeller.frame = self.frame;

Кадр уже был установлен в вызове initWithFrame.

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

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

Вам нужен правый центр для просмотра

Правый центр появится после показа контроллера и загрузки всех подпредставлений

Вам поможет метод viewDidLayoutSubviews

Код:

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    self.loadingPropeller.center = self.view.center; // changed you x,y
}


- (void)viewDidLoad
{
    [super viewDidLoad];
    self.loadingPropeller = [[FMLoadingPropeller alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
    [self.view addSubview:self.loadingPropeller];
    [self.loadingPropeller startPropeller];
}
...