CAShapeLayer выглядит сброшенным - PullRequest
0 голосов
/ 25 марта 2019

У меня есть простое круговое представление прогресса, которое заполняется, когда файл загружается.Большую часть времени он работает как задумано, но иногда он «сбрасывается» - он заполняется до определенной части, обычно до последней части до 100%, а затем внезапно достигает 0%, а затем до 100%.Вот его реализация:

@interface CircleView()

@property (nonatomic, strong) CAShapeLayer *circleLayer;

@end


@implementation CircleView

-(instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];

    if (self) {
        self.backgroundColor = UIColor.clearColor;

        UIBezierPath *circlePath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(self.frame.size.width / 2., self.frame.size.height / 2.0) radius: (self.frame.size.width - 10) / 2 startAngle:0.0 endAngle:M_PI * 2 clockwise:YES];

        CAShapeLayer *downLayer = [[CAShapeLayer alloc] init];
        downLayer.path = circlePath.CGPath;
        downLayer.fillColor = UIColor.clearColor.CGColor;
        downLayer.strokeColor = UIColor.lightGrayColor.CGColor;
        downLayer.lineWidth = 15.0;

        downLayer.strokeEnd = 1.0;

        self.circleLayer = [[CAShapeLayer alloc] init];
        self.circleLayer.path = circlePath.CGPath;
        self.circleLayer.fillColor = UIColor.clearColor.CGColor;
        self.circleLayer.strokeColor = UIColor.tubeWayRed.CGColor;
        self.circleLayer.lineWidth = 15.0;

        self.circleLayer.strokeEnd = 0.0;

        [self.layer addSublayer:downLayer];
        [self.layer addSublayer: self.circleLayer];
    }

    return self;
}

-(void)animateCircleToPart:(CGFloat)toPart {
    self.circleLayer.strokeEnd = toPart;
}

-(void)resetCircle {
    NSLog(@"Resetting circle");
    [CATransaction begin];
    [CATransaction setDisableActions:YES];
    self.circleLayer.strokeEnd = 0;
    [CATransaction commit];
}

@end

Журналы показывают, что он не сбрасывается методом reset до достижения 100%.Есть идеи, что может быть не так?Спасибо.

Исчезла проблема, связанная с вызовом self.circleLayer.strokeEnd = toPart; в [CATransaction begin] - [CATransaction commit], например:

-(void)animateCircleToPart: (CGFloat)toPart {
    [CATransaction begin];
    self.circleLayer.strokeEnd = toPart;
    [CATransaction commit];
}

Может кто-нибудь объяснить, почему?

1 Ответ

0 голосов
/ 25 марта 2019

Мое предложение будет таким:

 -(void)animateCircleToPart:(CGFloat)toPart {
if (toPart > self.circleLayer.strokeEnd){
    self.circleLayer.strokeEnd = toPart;}
 }
...