I have a UIslider setting the position for a AVAdioRecording:
CGRect frame = CGRectMake(50.0, 230.0, 200.0, 10.0);
aSlider = [[UISlider alloc] initWithFrame:frame];
// Set a timer which keep getting the current music time and update the UISlider in 1 sec interval
sliderTimer = [NSTimer scheduledTimerWithTimeInterval:0.4 target:self selector:@selector(updateSlider) userInfo:nil repeats:YES];
// Set the maximum value of the UISlider
aSlider.maximumValue = player.duration;
// Set the valueChanged target
[aSlider addTarget:self action:@selector(sliderChanged:) forControlEvents:UIControlEventValueChanged];
[self.ViewA addSubview:aSlider];
- (void)updateSlider {
// Update the slider about the music time
[UIView beginAnimations:@"returnSliderToInitialValue" context:NULL];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
[UIView setAnimationDuration:1.3];
aSlider.value = player.currentTime;
[UIView commitAnimations];
}
- (IBAction)sliderChanged:(UISlider *)sender {
// Fast skip the music when user scroll the UISlider
[player stop];
[player setCurrentTime:aSlider.value];
[player prepareToPlay];
[player play];
}
There are three questions i would like to ask.
1) Why does the animation for the value change not work? 2) Why does the slider position move only when I release my finger from the button and does not follow it? 3) Is using an NSTimer the best way to do it? I have heard that NSTimer is a lot memory consuming...
value
doesn't workYou obviously found the value
property. Check the documentation and you will see this sentence
To render an animated transition from the current value to the new value, you should use the
setValue:animated:
method instead.
So, just as the documentation says use
[aSlider setValue:player.currentTime animated:YES];
The reason you only get events when you release the finger is that your slider is not continuous. From the documentation of the continuous
property:
If
YES
, the slider sends update events continuously to the associated target’s action method. IfNO
, the slider only sends an action event when the user releases the slider’s thumb control to set the final value.
No, using a NSTimer to animate a change like this is definitely not the best way, I would say it's very bad practice to use a timer. Not only is it ineffective and possibly imprecise but you also lose the built in support for easing the animation.
If you really can't do it without a timer, then you should at least use a CADisplayLink
instead of a NSTimer
. It is made to work with UI updates (as opposed to NSTimer which isn't).