@@ -19,10 +19,9 @@ @implementation JWWaveView
1919
2020#pragma mark - Public
2121- (void )startWavingIfNeeded {
22- CAReplicatorLayer *replicatorLayer = [self replicatorLayer ];
23- CGRect replicatorRect = replicatorLayer.bounds ;
24- self.waveShapeLayer .frame = replicatorRect;
25-
22+ // force layout sublayers if layouts are pending
23+ [self layoutIfNeeded ];
24+
2625 // setup shape
2726 [self renewWavePathWithForceRenew: NO animated: NO ];
2827
@@ -65,6 +64,7 @@ - (void)configureIntialSetup {
6564 _waveDuration = 1.0 ;
6665 _waveColor = [UIColor blueColor ];
6766 _waveCycles = 1 ;
67+ _waveShift = 0 ;
6868}
6969
7070#pragma mark - Override
@@ -165,7 +165,7 @@ - (void)renewWavePathWithForceRenew:(BOOL)forceRenew animated:(BOOL)animated {
165165 for (CGFloat xPos = 0 .f ; xPos <= canvasWidth; xPos += 1 .f ) {
166166 // wave path starts at the canvasMidY and uses (canvasHeight * 0.5) as amplitude
167167 CGFloat halfAmplitude = canvasHeight / 4 .f ;
168- yPos = canvasMidY + sin ((xPos) /canvasWidth * M_PI * 2 * _waveCycles) * halfAmplitude;
168+ yPos = canvasMidY + sin ((xPos/canvasWidth) * M_PI * 2 * _waveCycles + _waveShift ) * halfAmplitude;
169169 if (fpclassify (xPos) == FP_ZERO) {
170170 [sinPath moveToPoint: (CGPoint){xPos, yPos}];
171171 }
@@ -209,6 +209,13 @@ - (void)setWaveDuration:(CGFloat)waveDuration {
209209 }
210210}
211211
212+ - (void )setWaveShift : (CGFloat)waveShift {
213+ if (waveShift < 0 || waveShift > 2 * M_PI) {
214+ return ;
215+ }
216+ _waveShift = waveShift;
217+ }
218+
212219#pragma mark - Lazy Loading
213220- (CAShapeLayer *)waveShapeLayer {
214221 if (!_waveShapeLayer) {
0 commit comments