我已經構建了一個自定義滑塊來顯示音樂曲目播放的進度並允許在曲目中進行清理。自定義UISlider像音樂應用程序
兩者功能都很好,但是一旦拖動停止並且滑塊重新定位,會有輕微的滯後(和跳動) - Apple Music應用程序滑塊是無縫的。
_scrubberSlider = [[ScrubberSlider alloc] initWithFrame:CGRectMake(0, 0, 300, 30)];
_scrubberSlider.continuous = YES;
_scrubberSlider.maximumValue = 1.0f;
_scrubberSlider.minimumValue = 0.0f;
[_scrubberSlider addTarget:self action:@selector(handleSliderMove:) forControlEvents:UIControlEventValueChanged];
- (void) handleSliderMove:(UISlider*)sender
{
CGFloat currentPlayback = sender.value * [[_theMusicPlayer.nowPlayingItem valueForKey:MPMediaItemPropertyPlaybackDuration] floatValue];
_theMusicPlayer.currentPlaybackTime = currentPlayback;
}
-(void) handleTrackTime
{
if (!trackTimer)
{
NSNumber *playBackTime = [NSNumber numberWithFloat: _musicPlayer.currentPlaybackTime];
trackTimer = [NSTimer scheduledTimerWithTimeInterval:0.1f target:self selector:@selector(timeIntervalFinished:) userInfo:@{@"playbackTime" : playBackTime} repeats:YES];
}
}
-(void) timeIntervalFinished:(NSTimer*)sender
{
[self playbackTimeUpdated:_musicPlayer.currentPlaybackTime];
}
-(void) playbackTimeUpdated:(CGFloat)playbackTime
{
// Update time label
[self updatePosition];
}
-(void) updatePosition
{
if (!_scrubberSlider.isScrubbing)
{
CGFloat percent = _theMusicPlayer.currentPlaybackTime/[[_theMusicPlayer.nowPlayingItem valueForKey:MPMediaItemPropertyPlaybackDuration] floatValue];
_scrubberSlider.value = percent;
}
}
定製滑塊
@interface ScrubberSlider : UISlider
@property(nonatomic) BOOL isScrubbing;
@end
@implementation ScrubberSlider
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
}
return self;
}
-(BOOL) beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event
{
[super beginTrackingWithTouch:touch withEvent:event];
_isScrubbing = YES;
return YES;
}
- (void)endTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event
{
[super endTrackingWithTouch:touch withEvent:event];
_isScrubbing = NO;
}
@end
查看此組件,將更容易與http://www.cocoacontrols.com/search?utf8=%E2%9C%93&q=music – 2013-03-05 08:24:04
一起工作我遇到了同樣的問題。我從來沒有能夠完全解決它,但以下幫助:1.如果值沒有改變,請不要設置currentPlaybackTime 2.不要在每次更改時設置currentPlaybackTime - 將值存儲在實例變量中,並通過一個定時器只有幾秒鐘。不過,它從來沒有像蘋果的滑蓋那樣流暢。 – EricS 2013-03-02 21:51:48
你可以嘗試1.在設置_isScrubbing = NO和2之前添加一個微小的延遲。嘗試動畫價值變化,而不是直接設置_scrubberSlider.value – 2013-03-07 10:52:39