Используйте анимированный CAShapeLayer с мазком в качестве маски - PullRequest
0 голосов
/ 18 января 2019

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

Я использую следующий код:

@implementation LoadingView

- (instancetype)init {
    self = [super init];
    if(self) {
        self.frame = CGRectMake(100, 100, 200, 200);
    }
    return self;
}

- (void)didMoveToSuperview {
    self.backgroundColor   = [UIColor greenColor];
    CAShapeLayer* pieShape = [CAShapeLayer layer];
    CGFloat radius         = 50;

    pieShape.path =
        [UIBezierPath bezierPathWithRoundedRect:CGRectMake(self.frame.size.width / 2 - radius, self.frame.size.height / 2 - radius, 100, 100) cornerRadius:radius].CGPath;
    pieShape.fillColor   = nil;
    pieShape.strokeColor = [UIColor blackColor].CGColor;
    pieShape.strokeStart = 0.f;

    pieShape.lineWidth = radius * 2.f;

    UIImageView* starView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"star"]];
    starView.frame        = CGRectMake(self.frame.size.width / 2 - 50.f, self.frame.size.height / 2 - 50.f, 100, 100);
    starView.contentMode  = UIViewContentModeScaleAspectFit;

    starView.layer.mask = pieShape;

    [self addSubview:starView];

    CABasicAnimation* pathAnimation   = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
    pathAnimation.duration            = 5.0;
    pathAnimation.fromValue           = @(0.f);
    pathAnimation.toValue             = @(1.f);
    pathAnimation.removedOnCompletion = NO;
    pathAnimation.fillMode            = kCAFillModeForwards;
    [pieShape addAnimation:pathAnimation forKey:@"strokeEndAnimation"];
}

@end

Здесь - это то, как выглядит слой маски, когда я добавляю его в представление и не делаю его маской

Здесь - это то, как выглядит изображение при применении маски

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