Я пытаюсь создать пользовательский индикатор загрузки, анимируя свойство 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
Здесь - это то, как выглядит слой маски, когда я добавляю его в представление и не делаю его маской
Здесь - это то, как выглядит изображение при применении маски