From 3e8437ae559487362fae3525beb79c534c213a51 Mon Sep 17 00:00:00 2001 From: 单军华 Date: Thu, 12 Jul 2018 13:44:34 +0800 Subject: [PATCH] bug修复和功能优化 --- screendisplay/Pods/ZFPlayer/ZFPlayer/Classes/Core/ZFOrientationObserver.m | 281 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 281 insertions(+), 0 deletions(-) diff --git a/screendisplay/Pods/ZFPlayer/ZFPlayer/Classes/Core/ZFOrientationObserver.m b/screendisplay/Pods/ZFPlayer/ZFPlayer/Classes/Core/ZFOrientationObserver.m new file mode 100755 index 0000000..65ab36b --- /dev/null +++ b/screendisplay/Pods/ZFPlayer/ZFPlayer/Classes/Core/ZFOrientationObserver.m @@ -0,0 +1,281 @@ + +// ZFOrentationObserver.m +// ZFPlayer +// +// Copyright (c) 2016��� ��������� ( http://github.com/renzifeng ) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#import "ZFOrientationObserver.h" + +@interface UIWindow (CurrentViewController) + +/*! + @method currentViewController + @return Returns the topViewController in stack of topMostController. + */ ++ (UIViewController*)zf_currentViewController; + +@end + +@implementation UIWindow (CurrentViewController) + ++ (UIViewController*)zf_currentViewController; { + UIWindow *window = [[UIApplication sharedApplication].delegate window]; + UIViewController *topViewController = [window rootViewController]; + while (true) { + if (topViewController.presentedViewController) { + topViewController = topViewController.presentedViewController; + } else if ([topViewController isKindOfClass:[UINavigationController class]] && [(UINavigationController*)topViewController topViewController]) { + topViewController = [(UINavigationController *)topViewController topViewController]; + } else if ([topViewController isKindOfClass:[UITabBarController class]]) { + UITabBarController *tab = (UITabBarController *)topViewController; + topViewController = tab.selectedViewController; + } else { + break; + } + } + return topViewController; +} + +@end + +static UIWindow *kWindow; + +@interface ZFOrientationObserver () + +@property (nonatomic, weak) UIView *view; + +@property (nonatomic, assign, getter=isFullScreen) BOOL fullScreen; + +@property (nonatomic, assign) NSInteger playerViewIndex; + +@property (nonatomic, strong) UIView *cell; + +@property (nonatomic, assign) NSInteger playerViewTag; + +@property (nonatomic, assign) ZFRotateType roateType; + +@end + +@implementation ZFOrientationObserver + +- (instancetype)init { + self = [super init]; + if (self) { + _duration = 0.25; + _fullScreenMode = ZFFullScreenModeLandscape; + kWindow = [(id)[UIApplication sharedApplication].delegate valueForKey:@"window"]; + _shouldAutorotate = YES; + } + return self; +} + +- (instancetype)initWithRotateView:(UIView *)rotateView containerView:(UIView *)containerView { + if ([self init]) { + _roateType = ZFRotateTypeNormal; + _view = rotateView; + _containerView = containerView; + } + return self; +} + +- (void)cellModelRotateView:(UIView *)rotateView rotateViewAtCell:(UIView *)cell playerViewTag:(NSInteger)playerViewTag { + self.roateType = ZFRotateTypeCell; + self.view = rotateView; + self.cell = cell; + self.playerViewTag = playerViewTag; +} + +- (void)cellSmallModelRotateView:(UIView *)rotateView containerView:(UIView *)containerView { + self.roateType = ZFRotateTypeCellSmall; + self.view = rotateView; + self.containerView = containerView; +} + +- (void)dealloc { + [self removeDeviceOrientationObserver]; +} + +- (void)addDeviceOrientationObserver { + if (![UIDevice currentDevice].generatesDeviceOrientationNotifications) { + [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; + } + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleDeviceOrientationChange) name:UIDeviceOrientationDidChangeNotification object:nil]; +} + +- (void)removeDeviceOrientationObserver { + if (![UIDevice currentDevice].generatesDeviceOrientationNotifications) { + [[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications]; + } + [[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil]; +} + +- (void)handleDeviceOrientationChange { + if (self.fullScreenMode == ZFFullScreenModePortrait) return; + if (!self.shouldAutorotate) return; + if (UIDeviceOrientationIsValidInterfaceOrientation([UIDevice currentDevice].orientation)) { + _currentOrientation = (UIInterfaceOrientation)[UIDevice currentDevice].orientation; + } else { + _currentOrientation = UIInterfaceOrientationUnknown; + return; + } + + UIInterfaceOrientation currentOrientation = [UIApplication sharedApplication].statusBarOrientation; + // Determine that if the current direction is the same as the direction you want to rotate, do nothing + if (_currentOrientation == currentOrientation) return; + + switch (_currentOrientation) { + case UIInterfaceOrientationPortrait: { + [self enterLandscapeFullScreen:UIInterfaceOrientationPortrait animated:YES]; + } + break; + case UIInterfaceOrientationLandscapeLeft: { + [self enterLandscapeFullScreen:UIInterfaceOrientationLandscapeLeft animated:YES]; + } + break; + case UIInterfaceOrientationLandscapeRight: { + [self enterLandscapeFullScreen:UIInterfaceOrientationLandscapeRight animated:YES]; + } + break; + default: break; + } +} + +- (void)enterLandscapeFullScreen:(UIInterfaceOrientation)orientation animated:(BOOL)animated { + if (self.fullScreenMode == ZFFullScreenModeLandscape) { + UIView *superview = nil; + CGRect frame; + if (UIInterfaceOrientationIsLandscape(orientation)) { + superview = kWindow; + if (!self.isFullScreen) { /// It's not set from the other side of the screen to this side + self.view.frame = [self.view convertRect:self.view.frame toView:superview]; + } + for (NSInteger i = 0; i < _containerView.subviews.count; i++) { + if (self.containerView.subviews[i] == self.view) { + self.playerViewIndex = i; + break; + } + } + self.fullScreen = YES; + [superview addSubview:_view]; + } else { + if (self.roateType == ZFRotateTypeCell) { + superview = [self.cell viewWithTag:self.playerViewTag]; + } else { + superview = self.containerView; + } + self.fullScreen = NO; + } + frame = [superview convertRect:superview.bounds toView:kWindow]; + _currentOrientation = orientation; + + [UIApplication sharedApplication].statusBarOrientation = orientation; + if (self.orientationWillChange) { + self.orientationWillChange(self, self.isFullScreen); + } + + [UIView animateWithDuration:self.duration animations:^{ + self.view.transform = [self getTransformRotationAngle:orientation]; + [UIView animateWithDuration:self.duration animations:^{ + self.view.frame = frame; + [self.view layoutIfNeeded]; + }]; + } completion:^(BOOL finished) { + if (!UIInterfaceOrientationIsLandscape(orientation) && self.roateType == ZFRotateTypeNormal) { + [superview insertSubview:self.view atIndex:self.playerViewIndex]; + } else if (!UIInterfaceOrientationIsLandscape(orientation)) { + [superview addSubview:self.view]; + } + self.view.frame = superview.bounds; + if (self.orientationDidChanged) self.orientationDidChanged(self, self.isFullScreen); + }]; + } +} + +/// Gets the rotation Angle of the transformation. +- (CGAffineTransform)getTransformRotationAngle:(UIInterfaceOrientation)orientation { + if (UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation) && orientation == UIInterfaceOrientationPortrait) { + return CGAffineTransformIdentity; + } + if (orientation == UIInterfaceOrientationPortrait) { + return CGAffineTransformIdentity; + } else if (orientation == UIInterfaceOrientationLandscapeLeft){ + return CGAffineTransformMakeRotation(-M_PI_2); + } else if(orientation == UIInterfaceOrientationLandscapeRight){ + return CGAffineTransformMakeRotation(M_PI_2); + } + return CGAffineTransformIdentity; +} + +- (void)enterPortraitFullScreen:(BOOL)fullScreen animated:(BOOL)animated { + if (self.fullScreenMode == ZFFullScreenModeLandscape) return; + UIView *superview = nil; + if (fullScreen) { + superview = kWindow; + self.view.frame = [self.view convertRect:self.view.frame toView:superview]; + [superview addSubview:self.view]; + self.fullScreen = YES; + if (self.orientationWillChange) { + self.orientationWillChange(self, self.isFullScreen); + } + } else { + if (self.roateType == ZFRotateTypeCell) { + superview = [self.cell viewWithTag:self.playerViewTag]; + } else { + superview = self.containerView; + } + self.fullScreen = NO; + if (self.orientationWillChange) { + self.orientationWillChange(self, self.isFullScreen); + } + } + CGRect frame = [superview convertRect:superview.bounds toView:kWindow]; + [UIView animateWithDuration:self.duration animations:^{ + self.view.frame = frame; + [self.view layoutIfNeeded]; + } completion:^(BOOL finished) { + [superview addSubview:self.view]; + self.view.frame = superview.bounds; + if (self.orientationDidChanged) { + self.orientationDidChanged(self, self.isFullScreen); + } + }]; +} + +- (void)setLockedScreen:(BOOL)lockedScreen { + _lockedScreen = lockedScreen; + if (lockedScreen) { + [self removeDeviceOrientationObserver]; + } else { + [self addDeviceOrientationObserver]; + } +} + +- (void)setFullScreen:(BOOL)fullScreen { + _fullScreen = fullScreen; + [[UIWindow zf_currentViewController] setNeedsStatusBarAppearanceUpdate]; +} + +- (void)setStatusBarHidden:(BOOL)statusBarHidden { + _statusBarHidden = statusBarHidden; + [[UIWindow zf_currentViewController] setNeedsStatusBarAppearanceUpdate]; +} + +@end -- Gitblit v1.8.0