123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761 |
- //
- // LMMediaPlayerView.m
- // iPodMusicSample
- //
- // Created by Akira Matsuda on 2014/01/10.
- // Copyright (c) 2014年 Akira Matsuda. All rights reserved.
- //
- #import "LMMediaPlayerView.h"
- #import <MediaPlayer/MediaPlayer.h>
- #import <objc/runtime.h>
- #import "LMMediaPlayerHelper.h"
- static CGFloat const kFullscreenTransitionDuration = 0.2;
- static CGFloat const kActionButtonDefaultEdgeLength = 35;
- static CGFloat const kActionButtonDefaultRightMergin = 8;
- NSString *const LMMediaPlayerViewPlayButtonImageKey = @"playButtonImageKey";
- NSString *const LMMediaPlayerViewPlayButtonSelectedImageKey = @"playButtonSelectedImageKey";
- NSString *const LMMediaPlayerViewStopButtonImageKey = @"stopButtonImageKey";
- NSString *const LMMediaPlayerViewStopButtonSelectedImageKey = @"stopButtonSelectedImageKey";
- NSString *const LMMediaPlayerViewFullscreenButtonImageKey = @"fullscreenButtonImageKey";
- NSString *const LMMediaPlayerViewFullscreenButtonSelectedImageKey = @"fullscreenButtonSelectedImageKey";
- NSString *const LMMediaPlayerViewUnfullscreenButtonImageKey = @"unfullscreenButtonImageKey";
- NSString *const LMMediaPlayerViewUnfullscreenButtonSelectedImageKey = @"unfullscreenButtonSelectedImageKey";
- NSString *const LMMediaPlayerViewShuffleButtonShuffledImageKey = @"shuffleButtonShuffledImageKey";
- NSString *const LMMediaPlayerViewShuffleButtonShuffledSelectedImageKey = @"shuffleButtonShuffledSelectedImageKey";
- NSString *const LMMediaPlayerViewShuffleButtonUnshuffledImageKey = @"shuffleButtonUnshuffledImageKey";
- NSString *const LMMediaPlayerViewShuffleButtonUnshuffledSelectedImageKey = @"shuffleButtonUnshuffledSelectedImageKey";
- NSString *const LMMediaPlayerViewRepeatButtonRepeatOneImageKey = @"repeatButtonRepeatOneImageKey";
- NSString *const LMMediaPlayerViewRepeatButtonRepeatOneSelectedImageKey = @"repeatButtonRepeatOneSelectedImageKey";
- NSString *const LMMediaPlayerViewRepeatButtonRepeatAllImageKey = @"repeatButtonRepeatAllImageKey";
- NSString *const LMMediaPlayerViewRepeatButtonRepeatAllSelectedImageKey = @"repeatButtonRepeatAllSelectedImageKey";
- NSString *const LMMediaPlayerViewRepeatButtonRepeatNoneImageKey = @"repeatButtonRepeatNoneImageKey";
- NSString *const LMMediaPlayerViewRepeatButtonRepeatNoneSelectedImageKey = @"repeatButtonRepeatNoneSelectedImageKey";
- NSString *const LMMediaPlayerViewActionButtonImageKey = @"LMMediaPlayerViewActionButtonImageKey";
- @interface UIViewController (LMMediaPlayerPrefersStatusBarHidden)
- - (void)mediaPlayerPrefersStatusBarHidden:(BOOL)hidden;
- @end
- @interface LMMediaPlayerFullscreenViewController : UIViewController
- @end
- @implementation LMMediaPlayerFullscreenViewController
- - (BOOL)shouldAutorotate
- {
- return YES;
- }
- - (UIInterfaceOrientationMask)supportedInterfaceOrientations
- {
- return UIInterfaceOrientationMaskAllButUpsideDown;
- }
- - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
- {
- return UIInterfaceOrientationPortrait;
- }
- @end
- @interface LMMediaPlayerView () {
- __unsafe_unretained IBOutlet UILabel *playbackTimeLabel_;
- __unsafe_unretained IBOutlet UILabel *remainingTimeLabel_;
- __unsafe_unretained IBOutlet UIView *headerView_;
- __unsafe_unretained IBOutlet UIView *footerView_;
- __unsafe_unretained IBOutlet UIImageView *artworkImageView_;
- __unsafe_unretained IBOutlet UIButton *playButton_;
- __unsafe_unretained IBOutlet UIButton *shuffleButton_;
- __unsafe_unretained IBOutlet UIButton *repeatButton_;
- //__unsafe_unretained IBOutlet UIButton *fullscreenButton_;
- __unsafe_unretained IBOutlet UIButton *actionButton_;
- __unsafe_unretained IBOutlet NSLayoutConstraint *actionButtonWidth_;
- __unsafe_unretained IBOutlet NSLayoutConstraint *actionButtonRightMergin;
- BOOL fullscreen_;
- BOOL seeking_;
- BOOL needToSetPlayer_;
- UIView *superView_;
- NSMutableDictionary *buttonImages_;
- AVPlayerLayer *playerLayer_;
- #if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_8_0
- UIVisualEffectView *headerBlurView_;
- UIVisualEffectView *footerBlurView_;
- #endif
- UIWindow *mainWindow_;
- }
- @end
- @implementation LMMediaPlayerView
- @synthesize isFullscreen = fullscreen_;
- static LMMediaPlayerView *sharedPlayerView;
- + (instancetype)sharedPlayerView
- {
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
- sharedPlayerView = [[self class] create];
- });
- return sharedPlayerView;
- }
- + (instancetype)create
- {
- return [[UINib nibWithNibName:NSStringFromClass([self class]) bundle:[NSBundle mainBundle]] instantiateWithOwner:nil options:nil][0];
- }
- - (instancetype)initWithFrame:(CGRect)frame
- {
- self = [super initWithFrame:frame];
- if (self) {
- [self setup];
- }
- return self;
- }
- - (void)drawRect:(CGRect)rect
- {
- [super drawRect:rect];
- if (needToSetPlayer_) {
- [playerLayer_ setPlayer:self.mediaPlayer.corePlayer];
- needToSetPlayer_ = NO;
- }
- }
- - (void)dealloc
- {
- _mediaPlayer.delegate = nil;
- [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationWillEnterForegroundNotification object:nil];
- [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidEnterBackgroundNotification object:nil];
- LM_RELEASE(playbackTimeLabel_);
- LM_RELEASE(remainingTimeLabel_);
- LM_RELEASE(headerView_);
- LM_RELEASE(footerView_);
- LM_RELEASE(artworkImageView_);
- LM_RELEASE(playButton_);
- LM_RELEASE(_nextButton);
- LM_RELEASE(_previousButton);
- LM_RELEASE(shuffleButton_);
- LM_RELEASE(repeatButton_);
- LM_RELEASE(fullscreenButton_);
- LM_RELEASE(_mediaPlayer);
- LM_RELEASE(buttonImages_);
- LM_DEALLOC(super);
- }
- - (void)awakeFromNib
- {
- [super awakeFromNib];
- [self setup];
- [self setupUserInterface];
- }
- - (void)layoutSubviews
- {
- // resize your layers based on the view's new bounds
- [super layoutSubviews];
- playerLayer_.frame = self.bounds;
- }
- - (UIButton *)actionButton
- {
- return actionButton_;
- }
- - (void)setBluredUserInterface:(BOOL)bluredUserInterface visualEffect:(UIVisualEffect *)effect
- {
- #if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_8_0
- if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_7_1) {
- _bluredUserInterface = bluredUserInterface;
- if (_bluredUserInterface == YES) {
- if (headerBlurView_ == nil) {
- headerBlurView_ = [[UIVisualEffectView alloc] initWithEffect:effect];
- footerBlurView_ = [[UIVisualEffectView alloc] initWithEffect:effect];
- headerBlurView_.frame = headerView_.bounds;
- headerBlurView_.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
- footerBlurView_.frame = footerView_.bounds;
- footerBlurView_.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
- [headerView_ insertSubview:headerBlurView_ atIndex:0];
- [footerView_ insertSubview:footerBlurView_ atIndex:0];
- }
- headerView_.backgroundColor = [UIColor clearColor];
- footerView_.backgroundColor = [UIColor clearColor];
- }
- else {
- UIColor *backgroundColor = [UIColor colorWithWhite:0.000 alpha:0.400];
- headerView_.backgroundColor = backgroundColor;
- footerView_.backgroundColor = backgroundColor;
- }
- headerBlurView_.hidden = footerBlurView_.hidden = !_bluredUserInterface;
- }
- #endif
- }
- #pragma mark -
- - (void)setup
- {
- [self setTranslatesAutoresizingMaskIntoConstraints:YES];
- self.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
- mainWindow_ = [[UIApplication sharedApplication] keyWindow];
- if (mainWindow_ == nil) {
- mainWindow_ = [[UIApplication sharedApplication] windows][0];
- }
- LM_RETAIN(mainWindow_);
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mediaPlayerBecomeForgroundMode:) name:UIApplicationWillEnterForegroundNotification object:nil];
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mediaPlayerBecomeBackgroundMode:) name:UIApplicationDidEnterBackgroundNotification object:nil];
- needToSetPlayer_ = NO;
- _userInterfaceHidden = NO;
- _mediaPlayer = [[LMMediaPlayer alloc] init];
- _mediaPlayer.delegate = self;
- }
- - (void)setupUserInterface
- {
- UITapGestureRecognizer *gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(reverseUserInterfaceHidden)];
- [self addGestureRecognizer:gesture];
- LM_RELEASE(gesture);
- artworkImageView_.contentMode = UIViewContentModeScaleAspectFit;
- [_currentTimeSlider addTarget:self action:@selector(beginSeek:) forControlEvents:UIControlEventTouchDown];
- [_currentTimeSlider addTarget:self action:@selector(seekPositionChanged:) forControlEvents:UIControlEventValueChanged];
- [_currentTimeSlider addTarget:self action:@selector(endSeek:) forControlEvents:(UIControlEventTouchUpInside | UIControlEventTouchUpOutside | UIControlEventTouchCancel)];
- [playButton_ addTarget:self action:@selector(changePlaybackState:) forControlEvents:UIControlEventTouchUpInside];
- [_nextButton addTarget:self action:@selector(fourcePlayNextMedia) forControlEvents:UIControlEventTouchUpInside];
- [_previousButton addTarget:self action:@selector(fourcePlayPreviousMedia) forControlEvents:UIControlEventTouchUpInside];
- UIColor *backgroundColor = [UIColor colorWithWhite:0.000 alpha:0.400];
- footerView_.backgroundColor = headerView_.backgroundColor = backgroundColor;
- [_mediaPlayer setShuffleEnabled:NO];
- [_mediaPlayer setRepeatMode:LMMediaRepeatModeDefault];
- buttonImages_ = [@{ LMMediaPlayerViewPlayButtonImageKey : [[self class] imageForFilename:@"play"],
- LMMediaPlayerViewPlayButtonSelectedImageKey : [[self class] imageForFilename:@"play"],
- LMMediaPlayerViewStopButtonImageKey : [[self class] imageForFilename:@"pause"],
- LMMediaPlayerViewStopButtonSelectedImageKey : [[self class] imageForFilename:@"pause"],
- LMMediaPlayerViewShuffleButtonShuffledImageKey : [[self class] imageForFilename:@"shuffle"],
- LMMediaPlayerViewShuffleButtonShuffledSelectedImageKey : [[self class] imageForFilename:@"shuffle"],
- LMMediaPlayerViewShuffleButtonUnshuffledImageKey : [[self class] imageForFilename:@"unshuffle"],
- LMMediaPlayerViewShuffleButtonUnshuffledSelectedImageKey : [[self class] imageForFilename:@"unshuffle"],
- LMMediaPlayerViewRepeatButtonRepeatNoneImageKey : [[self class] imageForFilename:@"repeat_none"],
- LMMediaPlayerViewRepeatButtonRepeatNoneSelectedImageKey : [[self class] imageForFilename:@"repeat_none"],
- LMMediaPlayerViewRepeatButtonRepeatOneImageKey : [[self class] imageForFilename:@"repeat_one"],
- LMMediaPlayerViewRepeatButtonRepeatOneSelectedImageKey : [[self class] imageForFilename:@"repeat_one"],
- LMMediaPlayerViewRepeatButtonRepeatAllImageKey : [[self class] imageForFilename:@"repeat_all"],
- LMMediaPlayerViewRepeatButtonRepeatAllSelectedImageKey : [[self class] imageForFilename:@"repeat_all"],
- LMMediaPlayerViewFullscreenButtonImageKey : [[self class] imageForFilename:@"fullscreen"],
- LMMediaPlayerViewFullscreenButtonSelectedImageKey : [[self class] imageForFilename:@"fullscreen"],
- LMMediaPlayerViewUnfullscreenButtonImageKey : [[self class] imageForFilename:@"unfullscreen"],
- LMMediaPlayerViewUnfullscreenButtonSelectedImageKey : [[self class] imageForFilename:@"unfullscreen"]
- } mutableCopy];
- [playButton_.imageView setContentMode:UIViewContentModeScaleAspectFit];
- [playButton_ setImage:buttonImages_[LMMediaPlayerViewPlayButtonImageKey] forState:UIControlStateNormal];
- [playButton_ setImage:buttonImages_[LMMediaPlayerViewPlayButtonSelectedImageKey] forState:UIControlStateSelected];
- [_fullscreenButton_.imageView setContentMode:UIViewContentModeScaleAspectFit];
- [_fullscreenButton_ setImage:buttonImages_[LMMediaPlayerViewFullscreenButtonImageKey] forState:UIControlStateNormal];
- [_fullscreenButton_ setImage:buttonImages_[LMMediaPlayerViewFullscreenButtonSelectedImageKey] forState:UIControlStateSelected];
- [repeatButton_.imageView setContentMode:UIViewContentModeScaleAspectFit];
- [repeatButton_ setImage:buttonImages_[LMMediaPlayerViewRepeatButtonRepeatNoneImageKey] forState:UIControlStateNormal];
- [repeatButton_ setImage:buttonImages_[LMMediaPlayerViewRepeatButtonRepeatNoneSelectedImageKey] forState:UIControlStateSelected];
- [shuffleButton_.imageView setContentMode:UIViewContentModeScaleAspectFit];
- [shuffleButton_ setImage:buttonImages_[LMMediaPlayerViewShuffleButtonUnshuffledImageKey] forState:UIControlStateNormal];
- [shuffleButton_ setImage:buttonImages_[LMMediaPlayerViewShuffleButtonUnshuffledSelectedImageKey] forState:UIControlStateSelected];
- [actionButton_.imageView setContentMode:UIViewContentModeScaleAspectFit];
- actionButtonWidth_.constant = 0;
- actionButtonRightMergin.constant = 0;
- }
- - (void)mediaPlayerBecomeForgroundMode:(NSNotification *)notification
- {
- needToSetPlayer_ = YES;
- [self setNeedsDisplay];
- }
- - (void)mediaPlayerBecomeBackgroundMode:(NSNotification *)notification
- {
- double delayInSeconds = 0.01;
- dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
- dispatch_after(popTime, dispatch_get_main_queue(), ^(void) {
- [playerLayer_ setPlayer:nil];
- if (self.mediaPlayer.playbackState == LMMediaPlaybackStatePlaying) {
- [self.mediaPlayer play];
- }
- });
- }
- #pragma mark LMMediaPlayerDelegate
- - (void)mediaPlayerWillChangeState:(LMMediaPlaybackState)state
- {
- if ([self.delegate respondsToSelector:@selector(mediaPlayerViewWillChangeState:state:)]) {
- [self.delegate mediaPlayerViewWillChangeState:self state:state];
- }
- if (state == LMMediaPlaybackStateStopped || state == LMMediaPlaybackStatePaused) {
- [playButton_ setImage:buttonImages_[LMMediaPlayerViewPlayButtonImageKey] ?: nil forState:UIControlStateNormal];
- [playButton_ setImage:buttonImages_[LMMediaPlayerViewPlayButtonSelectedImageKey] ?: nil forState:UIControlStateSelected];
- }
- else {
- [playButton_ setImage:buttonImages_[LMMediaPlayerViewStopButtonImageKey] ?: nil forState:UIControlStateNormal];
- [playButton_ setImage:buttonImages_[LMMediaPlayerViewStopButtonSelectedImageKey] ?: nil forState:UIControlStateSelected];
- }
- }
- - (BOOL)mediaPlayerWillStartPlaying:(LMMediaPlayer *)player media:(LMMediaItem *)media
- {
- BOOL result = NO;
- if ([self.delegate respondsToSelector:@selector(mediaPlayerViewWillStartPlaying:media:)] == YES) {
- result = [self.delegate mediaPlayerViewWillStartPlaying:self media:media];
- }
- else {
- result = YES;
- }
- self.titleLabel.text = media.title;
- return result;
- }
- - (void)mediaPlayerDidStartPlaying:(LMMediaPlayer *)player media:(LMMediaItem *)media
- {
- if (media.isVideo) {
- artworkImageView_.hidden = YES;
- self.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
- if (playerLayer_ == nil) {
- playerLayer_ = [AVPlayerLayer playerLayerWithPlayer:player.corePlayer];
- playerLayer_.frame = self.frame;
- [self.layer insertSublayer:playerLayer_ atIndex:0];
- }
- needToSetPlayer_ = YES;
- playerLayer_.hidden = NO;
- }
- else {
- playerLayer_.hidden = YES;
- artworkImageView_.hidden = NO;
- artworkImageView_.image = [media artworkImageWithSize:self.frame.size];
- }
- if ([self.delegate respondsToSelector:@selector(mediaPlayerViewDidStartPlaying:media:)]) {
- [self.delegate mediaPlayerViewDidStartPlaying:self media:media];
- }
- }
- - (void)mediaPlayerDidFinishPlaying:(LMMediaPlayer *)player media:(LMMediaItem *)media
- {
- _currentTimeSlider.value = 1.0;
- if ([self.delegate respondsToSelector:@selector(mediaPlayerViewDidFinishPlaying:media:)]) {
- [self.delegate mediaPlayerViewDidFinishPlaying:self media:media];
- }
- }
- - (void)mediaPlayerDidChangeCurrentTime:(LMMediaPlayer *)player
- {
- if (seeking_ == NO) {
- _currentTimeSlider.value = player.currentPlaybackTime / player.currentPlaybackDuration;
- NSMutableString *durationString = [NSMutableString new];
- NSInteger duration = (NSInteger)player.currentPlaybackTime;
- if (duration / (60 * 60) > 0) {
- [durationString appendFormat:@"%02ld:",
- (long int)duration / (60 * 60)];
- duration /= 60 * 60;
- }
- [durationString appendFormat:@"%02ld:", (long int)duration / 60];
- duration %= 60;
- [durationString appendFormat:@"%02ld", (long int)duration];
- playbackTimeLabel_.text = durationString;
- LM_RELEASE(durationString);
- durationString = [[NSMutableString alloc] initWithString:@"-"];
- duration = (NSInteger)fabs(player.currentPlaybackTime - player.currentPlaybackDuration);
- if (duration / (60 * 60) > 0) {
- [durationString appendFormat:@"%02ld:",
- (long int)duration / (60 * 60)];
- duration /= 60 * 60;
- }
- [durationString appendFormat:@"%02ld:", (long int)duration / 60];
- duration %= 60;
- [durationString appendFormat:@"%02ld", (long int)duration];
- remainingTimeLabel_.text = durationString;
- LM_RELEASE(durationString);
- }
- if ([self.delegate respondsToSelector:@selector(mediaPlayerViewDidChangeCurrentTime:)]) {
- [self.delegate mediaPlayerViewDidChangeCurrentTime:self];
- }
- }
- - (void)mediaPlayerDidChangeRepeatMode:(LMMediaRepeatMode)mode player:(LMMediaPlayer *)player
- {
- [self setRepeatButtonImageWithRepeatMode:mode];
- if ([self.delegate respondsToSelector:@selector(mediaPlayerViewDidChangeRepeatMode:playerView:)]) {
- [self.delegate mediaPlayerViewDidChangeRepeatMode:mode playerView:self];
- }
- }
- - (void)mediaPlayerDidChangeShuffleMode:(BOOL)enabled player:(LMMediaPlayer *)player
- {
- [self setShuffleButtonImageWithShuffleMode:enabled];
- if ([self.delegate respondsToSelector:@selector(mediaPlayerViewDidChangeShuffleMode:playerView:)]) {
- [self.delegate mediaPlayerViewDidChangeShuffleMode:enabled playerView:self];
- }
- }
- #pragma mark -
- - (void)beginSeek:(id)sender
- {
- seeking_ = YES;
- }
- - (void)seekPositionChanged:(id)sender
- {
- NSMutableString *durationString = [NSMutableString new];
- NSInteger currentTime = (NSInteger)_mediaPlayer.currentPlaybackDuration * _currentTimeSlider.value;
- NSInteger duration = currentTime;
- if (duration / (60 * 60) > 0) {
- [durationString appendFormat:@"%02ld:",
- (long int)duration / (60 * 60)];
- duration /= 60 * 60;
- }
- [durationString appendFormat:@"%02ld:", (long int)duration / 60];
- duration %= 60;
- [durationString appendFormat:@"%02ld", (long int)duration];
- playbackTimeLabel_.text = durationString;
- LM_RELEASE(durationString);
- durationString = [[NSMutableString alloc] initWithString:@"-"];
- duration = (NSInteger)_mediaPlayer.currentPlaybackDuration - currentTime;
- if (duration / (60 * 60) > 0) {
- [durationString appendFormat:@"%02ld:",
- (long int)duration / (60 * 60)];
- duration /= 60 * 60;
- }
- [durationString appendFormat:@"%02ld:", (long int)duration / 60];
- duration %= 60;
- [durationString appendFormat:@"%02ld", (long int)duration];
- remainingTimeLabel_.text = durationString;
- LM_RELEASE(durationString);
- }
- - (void)endSeek:(id)sender
- {
- UISlider *slider = (UISlider *)sender;
- [_mediaPlayer seekTo:_mediaPlayer.currentPlaybackDuration * slider.value];
- seeking_ = NO;
- }
- - (void)changePlaybackState:(id)sender
- {
- if ([_mediaPlayer playbackState] == LMMediaPlaybackStatePlaying) {
- [_mediaPlayer pause];
- }
- else if ([_mediaPlayer playbackState] == LMMediaPlaybackStatePaused || [_mediaPlayer playbackState] == LMMediaPlaybackStateStopped) {
- [_mediaPlayer play];
- }
- }
- - (void)reverseUserInterfaceHidden
- {
- if (seeking_ == NO) {
- [self setUserInterfaceHidden:!_userInterfaceHidden];
- }
- }
- - (void)fourcePlayNextMedia
- {
- LMMediaRepeatMode repeatMode = _mediaPlayer.repeatMode;
- if (repeatMode == LMMediaRepeatModeOne) {
- _mediaPlayer.repeatMode = LMMediaRepeatModeDefault;
- }
- [_mediaPlayer playNextMedia];
- _mediaPlayer.repeatMode = repeatMode;
- }
- - (void)fourcePlayPreviousMedia
- {
- LMMediaRepeatMode repeatMode = _mediaPlayer.repeatMode;
- if (repeatMode == LMMediaRepeatModeOne) {
- _mediaPlayer.repeatMode = LMMediaRepeatModeDefault;
- }
- [_mediaPlayer playPreviousMedia];
- _mediaPlayer.repeatMode = repeatMode;
- }
- - (IBAction)shuffleButtonPressed:(id)sender
- {
- [_mediaPlayer setShuffleEnabled:!_mediaPlayer.shuffleMode];
- if (_mediaPlayer.shuffleMode) {
- [shuffleButton_ setImage:buttonImages_[LMMediaPlayerViewShuffleButtonShuffledImageKey] forState:UIControlStateNormal];
- [shuffleButton_ setImage:buttonImages_[LMMediaPlayerViewShuffleButtonShuffledSelectedImageKey] forState:UIControlStateSelected];
- }
- else {
- [shuffleButton_ setImage:buttonImages_[LMMediaPlayerViewShuffleButtonUnshuffledImageKey] forState:UIControlStateNormal];
- [shuffleButton_ setImage:buttonImages_[LMMediaPlayerViewShuffleButtonUnshuffledSelectedImageKey] forState:UIControlStateSelected];
- }
- [self setRepeatButtonImageWithRepeatMode:_mediaPlayer.repeatMode];
- }
- - (IBAction)repeatButtonPressed:(id)sender
- {
- switch (_mediaPlayer.repeatMode) {
- case LMMediaRepeatModeAll: {
- _mediaPlayer.repeatMode = LMMediaRepeatModeOne;
- } break;
- case LMMediaRepeatModeOne: {
- _mediaPlayer.repeatMode = LMMediaRepeatModeDefault;
- } break;
- case LMMediaRepeatModeDefault: {
- _mediaPlayer.repeatMode = LMMediaRepeatModeAll;
- } break;
- default:
- break;
- }
- [self setRepeatButtonImageWithRepeatMode:_mediaPlayer.repeatMode];
- }
- - (void)setShuffleButtonImageWithShuffleMode:(BOOL)mode
- {
- if (mode) {
- [shuffleButton_ setImage:buttonImages_[LMMediaPlayerViewShuffleButtonShuffledImageKey] forState:UIControlStateNormal];
- [shuffleButton_ setImage:buttonImages_[LMMediaPlayerViewShuffleButtonShuffledSelectedImageKey] forState:UIControlStateSelected];
- }
- else {
- [shuffleButton_ setImage:buttonImages_[LMMediaPlayerViewShuffleButtonUnshuffledImageKey] forState:UIControlStateNormal];
- [shuffleButton_ setImage:buttonImages_[LMMediaPlayerViewShuffleButtonUnshuffledSelectedImageKey] forState:UIControlStateSelected];
- }
- }
- - (void)setRepeatButtonImageWithRepeatMode:(LMMediaRepeatMode)mode
- {
- switch (_mediaPlayer.repeatMode) {
- case LMMediaRepeatModeAll: {
- [repeatButton_ setImage:buttonImages_[LMMediaPlayerViewRepeatButtonRepeatAllImageKey] forState:UIControlStateNormal];
- [repeatButton_ setImage:buttonImages_[LMMediaPlayerViewRepeatButtonRepeatAllSelectedImageKey] forState:UIControlStateSelected];
- } break;
- case LMMediaRepeatModeOne: {
- [repeatButton_ setImage:buttonImages_[LMMediaPlayerViewRepeatButtonRepeatOneImageKey] forState:UIControlStateNormal];
- [repeatButton_ setImage:buttonImages_[LMMediaPlayerViewRepeatButtonRepeatOneSelectedImageKey] forState:UIControlStateSelected];
- } break;
- case LMMediaRepeatModeDefault: {
- [repeatButton_ setImage:buttonImages_[LMMediaPlayerViewRepeatButtonRepeatNoneImageKey] forState:UIControlStateNormal];
- [repeatButton_ setImage:buttonImages_[LMMediaPlayerViewRepeatButtonRepeatNoneSelectedImageKey] forState:UIControlStateSelected];
- } break;
- default: {
- [repeatButton_ setImage:buttonImages_[LMMediaPlayerViewRepeatButtonRepeatNoneImageKey] forState:UIControlStateNormal];
- [repeatButton_ setImage:buttonImages_[LMMediaPlayerViewRepeatButtonRepeatNoneSelectedImageKey] forState:UIControlStateSelected];
- } break;
- }
- }
- - (IBAction)fullscreenButtonPressed:(id)sender
- {
- [self setFullscreen:!fullscreen_];
- }
- #pragma mark -
- - (void)setHeaderViewHidden:(BOOL)hidden
- {
- headerView_.hidden = hidden;
- }
- - (void)setFooterViewHidden:(BOOL)hidden
- {
- footerView_.hidden = hidden;
- }
- - (void)setUserInterfaceHidden:(BOOL)hidden
- {
- _userInterfaceHidden = hidden;
- if (hidden) {
- [UIView animateWithDuration:0.3 animations:^{
- headerView_.alpha = 0;
- footerView_.alpha = 0;
- _currentTimeSlider.alpha = 0;
- _nextButton.superview.alpha = 0;
- _previousButton.superview.alpha = 0;
- } completion:^(BOOL finished){
- }];
- }
- else {
- [UIView animateWithDuration:0.3 animations:^{
- headerView_.alpha = 1;
- footerView_.alpha = 1;
- _currentTimeSlider.alpha = 1;
- _nextButton.superview.alpha = 1;
- _previousButton.superview.alpha = 1;
- } completion:^(BOOL finished){
- }];
- }
- }
- - (void)setFullscreen:(BOOL)fullscreen animated:(BOOL)animated
- {
- if (fullscreen_ == fullscreen) {
- return;
- }
- if ([self.delegate respondsToSelector:@selector(mediaPlayerViewWillChangeFullscreenMode:)]) {
- [self.delegate mediaPlayerViewWillChangeFullscreenMode:fullscreen];
- }
- LMMediaPlayerFullscreenViewController *viewController = [[LMMediaPlayerFullscreenViewController alloc] init];
- LM_AUTORELEASE(viewController);
- viewController.view.frame = [UIScreen mainScreen].bounds;
- if (floor(NSFoundationVersionNumber) >= NSFoundationVersionNumber_iOS_7_0) {
- viewController.extendedLayoutIncludesOpaqueBars = YES;
- }
- else {
- //viewController.wantsFullScreenLayout = YES;
- }
- CGRect newRect;
- if (fullscreen == NO) {
- [_fullscreenButton_ setImage:buttonImages_[LMMediaPlayerViewFullscreenButtonImageKey] forState:UIControlStateNormal];
- [_fullscreenButton_ setImage:buttonImages_[LMMediaPlayerViewFullscreenButtonSelectedImageKey] forState:UIControlStateSelected];
- newRect = superView_.bounds;
- newRect.size.height = newRect.size.height - 20; //TWS
-
- self.frame = newRect;
- [superView_ addSubview:self];
- LM_RELEASE(superView_);
- [mainWindow_ makeKeyAndVisible];
- [[[UIApplication sharedApplication] delegate] setWindow:mainWindow_];
- [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];
- [[UIApplication sharedApplication] setStatusBarOrientation:[[UIApplication sharedApplication] statusBarOrientation]];
- [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade];
- }
- else {
- [_fullscreenButton_ setImage:buttonImages_[LMMediaPlayerViewUnfullscreenButtonImageKey] forState:UIControlStateNormal];
- [_fullscreenButton_ setImage:buttonImages_[LMMediaPlayerViewUnfullscreenButtonSelectedImageKey] forState:UIControlStateSelected];
- superView_ = self.superview;
- LM_RETAIN(superView_);
- newRect = mainWindow_.frame;
- //UIViewController *rootViewController = [mainWindow_ rootViewController];
- UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; //rootViewController.interfaceOrientation;
- if (orientation == UIInterfaceOrientationLandscapeRight || orientation == UIInterfaceOrientationLandscapeLeft) {
- if (floor(NSFoundationVersionNumber) >= NSFoundationVersionNumber_iOS_7_0) {
- newRect = CGRectMake(0, 0, CGRectGetWidth(mainWindow_.frame), CGRectGetHeight(mainWindow_.frame));
- }
- else {
- newRect = CGRectMake(0, 0, CGRectGetHeight(mainWindow_.frame), CGRectGetWidth(mainWindow_.frame));
- }
- }
- [self removeFromSuperview];
- [viewController.view addSubview:self];
- UIWindow *newWindow = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
- newWindow.windowLevel = UIWindowLevelAlert;
- newWindow.rootViewController = viewController;
- [newWindow addSubview:viewController.view];
- [newWindow makeKeyAndVisible];
- [[[UIApplication sharedApplication] delegate] setWindow:newWindow];
- LM_RELEASE(newWindow);
- }
- self.frame = newRect;
- if (animated) {
- self.alpha = 0;
- [UIView animateWithDuration:kFullscreenTransitionDuration animations:^{
- self.alpha = 1;
- }];
- }
- fullscreen_ = fullscreen;
- if ([self.delegate respondsToSelector:@selector(mediaPlayerViewDidChangeFullscreenMode:)]) {
- [self.delegate mediaPlayerViewDidChangeFullscreenMode:fullscreen];
- }
- [[UIApplication sharedApplication] setStatusBarHidden:fullscreen];
- [[NSNotificationCenter defaultCenter] postNotificationName:UIDeviceOrientationDidChangeNotification object:[UIDevice currentDevice]];
- }
- - (void)setFullscreen:(BOOL)fullscreen
- {
- [self setFullscreen:fullscreen animated:YES];
- }
- - (void)setButtonImages:(NSDictionary *)info
- {
- for (NSString *key in info) {
- buttonImages_[key] = info[key];
- }
- if ([buttonImages_[LMMediaPlayerViewActionButtonImageKey] isKindOfClass:[UIImage class]]) {
- actionButtonWidth_.constant = kActionButtonDefaultEdgeLength;
- actionButtonRightMergin.constant = kActionButtonDefaultRightMergin;
- [actionButton_ setImage:info[LMMediaPlayerViewActionButtonImageKey] forState:UIControlStateNormal];
- }
- else {
- actionButtonWidth_.constant = 0;
- actionButtonRightMergin.constant = 0;
- }
- [self updateButtonImages];
- }
- - (void)updateButtonImages
- {
- if (self.mediaPlayer.playbackState == LMMediaPlaybackStatePlaying) {
- [playButton_ setImage:buttonImages_[LMMediaPlayerViewStopButtonImageKey] forState:UIControlStateNormal];
- [playButton_ setImage:buttonImages_[LMMediaPlayerViewStopButtonSelectedImageKey] forState:UIControlStateSelected];
- }
- else {
- [playButton_ setImage:buttonImages_[LMMediaPlayerViewPlayButtonImageKey] forState:UIControlStateNormal];
- [playButton_ setImage:buttonImages_[LMMediaPlayerViewPlayButtonSelectedImageKey] forState:UIControlStateSelected];
- }
- if (self.isFullscreen) {
- [_fullscreenButton_ setImage:buttonImages_[LMMediaPlayerViewUnfullscreenButtonImageKey] forState:UIControlStateNormal];
- [_fullscreenButton_ setImage:buttonImages_[LMMediaPlayerViewUnfullscreenButtonSelectedImageKey] forState:UIControlStateSelected];
- }
- else {
- [_fullscreenButton_ setImage:buttonImages_[LMMediaPlayerViewFullscreenButtonImageKey] forState:UIControlStateNormal];
- [_fullscreenButton_ setImage:buttonImages_[LMMediaPlayerViewFullscreenButtonSelectedImageKey] forState:UIControlStateSelected];
- }
- [self setRepeatButtonImageWithRepeatMode:self.mediaPlayer.repeatMode];
- [self setShuffleButtonImageWithShuffleMode:self.mediaPlayer.shuffleMode];
- }
- + (UIImage *)imageForFilename:(NSString *)filename
- {
- NSString *version = @"7";
- if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1) {
- version = @"6";
- }
- UIImage *image = [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@/%@.png", [[NSBundle mainBundle] pathForResource:@"LMMediaPlayerView" ofType:@"bundle"], version, filename]];
- return image;
- }
- @end
|