I encountered the same problem.I tried different OS and got different result for same code flag:
one device only call layoutSubViews once, but another one called twice which caused one bug for my code...
My Code:
CGFloat step = 0.0;
if (self.array_rateOfEachColor) {
CGFloat sumRate = 0.0;
for (NSString *rate in self.array_rateOfEachColor) {
sumRate +=[rate floatValue];
}
NSAssert(sumRate != 1.0 , @" sum of all elemetns for array array_rateOfEachColor must be 1.0 ");
for (int i = 0 ; i < [self.mutableArray_layers count]; i ++) {
CGFloat step = [[_array_rateOfEachColor objectAtIndex:i] floatValue];
CAShapeLayer *tmp = [self.mutableArray_layers objectAtIndex:i];
[tmp setStrokeStart:self.strokeEndValue];
if (i == (self.mutableArray_layers.count -1)) { //the last layer
self.strokeEndValue = 1.0 - self.space ;
[tmp setStrokeEnd:self.strokeEndValue];
}else {
[tmp setStrokeEnd:self.strokeEndValue + step ];
}
self.strokeEndValue += (step + self.space); // record last strokeEndValue
}
}else{
step = 1.0 / self.mutableArray_layers.count; //average step
for (int i = 0 ; i < [self.mutableArray_layers count]; i ++) {
CAShapeLayer *tmp = [self.mutableArray_layers objectAtIndex:i];
[tmp setStrokeStart:self.strokeEndValue];
if (i == (self.mutableArray_layers.count -1)) { //the last layer
self.strokeEndValue = 1.0 - self.space ;
[tmp setStrokeEnd:self.strokeEndValue];
}else {
[tmp setStrokeEnd:self.strokeEndValue + step ];
}
self.strokeEndValue += (step + self.space); // record last strokeEndValue
}
}
self.strokeEndValue = 0.0; // different os , the layoutSubViews was called different times,so,this line is resolve this problem so that figure can be shown correctly
}