You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

222 lines
6.6 KiB
Objective-C

//
// SuperPlayerWindow.m
// TXLiteAVDemo
//
// Created by annidyfeng on 2018/6/26.
// Copyright © 2018年 Tencent. All rights reserved.
//
#import "SuperPlayerWindow.h"
#import "SuperPlayer.h"
#import "SuperPlayerView+Private.h"
#import "UIView+MMLayout.h"
#import "DataReport.h"
#import "UIView+Fade.h"
#import "TXVodPlayListener.h"
#define FLOAT_VIEW_WIDTH 200
#define FLOAT_VIEW_HEIGHT 112
@interface SuperPlayerWindow()<TXVodPlayListener>
@property (weak) UIView *origFatherView;
@property CGRect floatViewRect;
@end
@implementation SuperPlayerWindow {
UIView *_rootView;
UIButton *_closeBtn;
UIButton *_backBtn;
}
+ (instancetype)sharedInstance {
static SuperPlayerWindow *instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[SuperPlayerWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
});
return instance;
}
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
self.windowLevel = UIWindowLevelStatusBar - 1;
self.rootViewController = [UIViewController new];
self.rootViewController.view.backgroundColor = [UIColor clearColor];
self.rootViewController.view.userInteractionEnabled = NO;
_rootView = [[UIView alloc] initWithFrame:CGRectZero];
_rootView.backgroundColor = [UIColor blackColor];
UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGestureRecognizer:)];
[_rootView addGestureRecognizer:panGesture];
UIButton *closeBtn = [UIButton buttonWithType:UIButtonTypeCustom];
closeBtn = [UIButton buttonWithType:UIButtonTypeCustom];
[closeBtn setImage:SuperPlayerImage(@"close") forState:UIControlStateNormal];
[closeBtn addTarget:self action:@selector(closeBtnClick:) forControlEvents:UIControlEventTouchUpInside];
[_rootView addSubview:closeBtn];
[closeBtn sizeToFit];
_closeBtn = closeBtn;
CGRect rect = CGRectMake(ScreenWidth-FLOAT_VIEW_WIDTH, ScreenHeight-FLOAT_VIEW_HEIGHT, FLOAT_VIEW_WIDTH, FLOAT_VIEW_HEIGHT);
if (IsIPhoneX) {
rect.origin.y -= 44;
}
self.floatViewRect = rect;
self.hidden = YES;
return self;
}
- (void)show {
_rootView.frame = self.floatViewRect;
[self addSubview:_rootView];
self.hidden = NO;
self.origFatherView = self.superPlayer.fatherView;
if (self.origFatherView != _rootView) {
self.superPlayer.fatherView = _rootView;
}
[self.superPlayer.controlView fadeOut:0.01];
[_rootView bringSubviewToFront:_backBtn];
[_rootView bringSubviewToFront:_closeBtn];
_closeBtn.m_width(42).m_height(42).m_top(0).m_right(0);
_isShowing = YES;
[DataReport report:@"floatmode" param:nil];
}
- (void)hide {
self.floatViewRect = _rootView.frame;
[_rootView removeFromSuperview];
self.hidden = YES;
self.superPlayer.fatherView = self.origFatherView;
_isShowing = NO;
}
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
if (CGRectContainsPoint(_rootView.bounds,
[_rootView convertPoint:point fromView:self])) {
return [super pointInside:point withEvent:event];
}
return NO;
}
- (void)closeBtnClick:(id)sender
{
if (self.closeHandler) {
self.closeHandler();
} else {
[self hide];
[_superPlayer resetPlayer];
self.backController = nil;
}
}
- (void)backBtnClick:(id)sender
{
if (self.backHandler) {
self.backHandler();
} else {
[self hide];
[self.topNavigationController pushViewController:self.backController animated:YES];
self.backController = nil;
}
}
- (UINavigationController *)topNavigationController {
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.navigationController;
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
[self backBtnClick:nil];
}
#pragma mark - GestureRecognizer
// 手势处理
- (void)panGestureRecognizer:(UIPanGestureRecognizer *)panGesture {
if (UIGestureRecognizerStateBegan == panGesture.state) {
}
else if (UIGestureRecognizerStateChanged == panGesture.state) {
CGPoint translation = [panGesture translationInView:self];
CGPoint center = _rootView.center;
center.x += translation.x;
center.y += translation.y;
_rootView.center = center;
UIEdgeInsets effectiveEdgeInsets = UIEdgeInsetsZero; // 边距可以自己调
CGFloat leftMinX = 0.0f + effectiveEdgeInsets.left;
CGFloat topMinY = 0.0f + effectiveEdgeInsets.top;
CGFloat rightMaxX = self.bounds.size.width - _rootView.bounds.size.width + effectiveEdgeInsets.right;
CGFloat bottomMaxY = self.bounds.size.height - _rootView.bounds.size.height + effectiveEdgeInsets.bottom;
CGRect frame = _rootView.frame;
frame.origin.x = frame.origin.x > rightMaxX ? rightMaxX : frame.origin.x;
frame.origin.x = frame.origin.x < leftMinX ? leftMinX : frame.origin.x;
frame.origin.y = frame.origin.y > bottomMaxY ? bottomMaxY : frame.origin.y;
frame.origin.y = frame.origin.y < topMinY ? topMinY : frame.origin.y;
_rootView.frame = frame;
// zero
[panGesture setTranslation:CGPointZero inView:self];
}
else if (UIGestureRecognizerStateEnded == panGesture.state) {
}
}
/**
* 点播事件通知
*
* @param player 点播对象
* @param EvtID 参见TXLiveSDKTypeDef.h
* @param param 参见TXLiveSDKTypeDef.h
*/
-(void) onPlayEvent:(TXVodPlayer *)player event:(int)EvtID withParam:(NSDictionary*)param
{
}
/**
* 网络状态通知
*
* @param player 点播对象
* @param param 参见TXLiveSDKTypeDef.h
*/
-(void) onNetStatus:(TXVodPlayer *)player withParam:(NSDictionary*)param
{
}
@end