Tôi đã tạo thanh trượt tùy chỉnh để hiển thị tiến trình phát nhạc và cho phép chà trong bản nhạc.UISlider tùy chỉnh như ứng dụng Nhạc
Cả hai chức năng đều tốt, nhưng có một độ trễ nhỏ (và chuyển động nhanh) khi kéo đã dừng và thanh trượt được định vị lại - Thanh trượt ứng dụng Apple Music liền mạch.
_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;
}
}
Tục Slider
@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
Kiểm tra các thành phần này, sẽ dễ dàng hơn khi làm việc với http://www.cocoacontrols.com/search?utf8=%E2%9C%93&q=music –
Tôi gặp vấn đề tương tự. Tôi đã không bao giờ có thể sửa chữa nó hoàn toàn, nhưng sau đây đã giúp: 1. Không đặt currentPlaybackTime nếu giá trị không thay đổi 2. Không đặt currentPlaybackTime mọi thay đổi - lưu trữ giá trị trong một biến mẫu và đặt nó qua bộ đếm thời gian chỉ vài lần trong một giây. Nó không bao giờ là chất lỏng như thanh trượt của Apple, mặc dù. – EricS
bạn có thể thử 1. thêm một chút chậm trễ trước khi thiết lập _isScrubbing = NO và 2). thử làm thay đổi giá trị thay vì đặt _scrubberSlider.value trực tiếp –