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/ZFPlayerGestureControl.m | 238 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 238 insertions(+), 0 deletions(-) diff --git a/screendisplay/Pods/ZFPlayer/ZFPlayer/Classes/Core/ZFPlayerGestureControl.m b/screendisplay/Pods/ZFPlayer/ZFPlayer/Classes/Core/ZFPlayerGestureControl.m new file mode 100755 index 0000000..8765f90 --- /dev/null +++ b/screendisplay/Pods/ZFPlayer/ZFPlayer/Classes/Core/ZFPlayerGestureControl.m @@ -0,0 +1,238 @@ +// +// ZFPlayerGestureControl.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 "ZFPlayerGestureControl.h" + +@interface ZFPlayerGestureControl ()<UIGestureRecognizerDelegate> + +@property (nonatomic, strong) UITapGestureRecognizer *singleTap; +@property (nonatomic, strong) UITapGestureRecognizer *doubleTap; +@property (nonatomic, strong) UIPanGestureRecognizer *panGR; +@property (nonatomic, strong) UIPinchGestureRecognizer *pinchGR; +@property (nonatomic) ZFPanDirection panDirection; +@property (nonatomic) ZFPanLocation panLocation; +@property (nonatomic) ZFPanMovingDirection panMovingDirection; +@property (nonatomic, weak) UIView *targetView; + +@end + +@implementation ZFPlayerGestureControl + +- (void)addGestureToView:(UIView *)view { + self.targetView = view; + self.targetView.multipleTouchEnabled = YES; + [self.singleTap requireGestureRecognizerToFail:self.doubleTap]; + [self.doubleTap requireGestureRecognizerToFail:self.panGR]; + [self.targetView addGestureRecognizer:self.singleTap]; + [self.targetView addGestureRecognizer:self.doubleTap]; + [self.targetView addGestureRecognizer:self.panGR]; + [self.targetView addGestureRecognizer:self.pinchGR]; +} + +- (void)removeGestureToView:(UIView *)view { + [view removeGestureRecognizer:self.singleTap]; + [view removeGestureRecognizer:self.doubleTap]; + [view removeGestureRecognizer:self.panGR]; + [view removeGestureRecognizer:self.pinchGR]; +} + +- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { + ZFPlayerGestureType type = ZFPlayerGestureTypeUnknown; + if (gestureRecognizer == self.singleTap) type = ZFPlayerGestureTypeSingleTap; + else if (gestureRecognizer == self.doubleTap) type = ZFPlayerGestureTypeDoubleTap; + else if (gestureRecognizer == self.panGR) type = ZFPlayerGestureTypePan; + else if (gestureRecognizer == self.pinchGR) type = ZFPlayerGestureTypePinch; + CGPoint locationPoint = [touch locationInView:touch.view]; + if (locationPoint.x > _targetView.bounds.size.width / 2) { + self.panLocation = ZFPanLocationRight; + } else { + self.panLocation = ZFPanLocationLeft; + } + + ZFPlayerDisableGestureTypes disableTypes = self.disableTypes; + if (disableTypes & ZFPlayerDisableGestureTypesAll) { + disableTypes = ZFPlayerDisableGestureTypesPan | ZFPlayerDisableGestureTypesPinch | ZFPlayerDisableGestureTypesDoubleTap | ZFPlayerDisableGestureTypesSingleTap; + } + switch (type) { + case ZFPlayerGestureTypeUnknown: break; + case ZFPlayerGestureTypePan: { + if (disableTypes & ZFPlayerDisableGestureTypesPan) { + return NO; + } + } + break; + case ZFPlayerGestureTypePinch: { + if (disableTypes & ZFPlayerDisableGestureTypesPinch) { + return NO; + } + } + break; + case ZFPlayerGestureTypeDoubleTap: { + if (disableTypes & ZFPlayerDisableGestureTypesDoubleTap) { + return NO; + } + } + break; + case ZFPlayerGestureTypeSingleTap: { + if (disableTypes & ZFPlayerDisableGestureTypesSingleTap) { + return NO; + } + } + break; + } + + if (self.triggerCondition) return self.triggerCondition(self, type, gestureRecognizer, touch); + return YES; +} + +// Whether to support multi-trigger, return YES, you can trigger a method with multiple gestures, return NO is mutually exclusive +- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { + if (otherGestureRecognizer != self.singleTap && + otherGestureRecognizer != self.doubleTap && + otherGestureRecognizer != self.panGR && + otherGestureRecognizer != self.pinchGR) return NO; + if (gestureRecognizer.numberOfTouches >= 2) { + return NO; + } + return YES; +} + +- (UITapGestureRecognizer *)singleTap { + if (!_singleTap){ + _singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)]; + _singleTap.delegate = self; + _singleTap.delaysTouchesBegan = YES; + _singleTap.delaysTouchesEnded = YES; + _singleTap.numberOfTouchesRequired = 1; + _singleTap.numberOfTapsRequired = 1; + } + return _singleTap; +} + +- (UITapGestureRecognizer *)doubleTap { + if (!_doubleTap) { + _doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)]; + _doubleTap.delegate = self; + _doubleTap.delaysTouchesBegan = YES; + _singleTap.delaysTouchesEnded = YES; + _doubleTap.numberOfTouchesRequired = 1; + _doubleTap.numberOfTapsRequired = 2; + } + return _doubleTap; +} + +- (UIPanGestureRecognizer *)panGR { + if (!_panGR) { + _panGR = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)]; + _panGR.delegate = self; + _panGR.delaysTouchesBegan = YES; + _panGR.delaysTouchesEnded = YES; + _panGR.maximumNumberOfTouches = 1; + _panGR.cancelsTouchesInView = YES; + } + return _panGR; +} + +- (UIPinchGestureRecognizer *)pinchGR { + if (!_pinchGR) { + _pinchGR = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinch:)]; + _pinchGR.delegate = self; + _pinchGR.delaysTouchesBegan = YES; + } + return _pinchGR; +} + +- (void)handleSingleTap:(UITapGestureRecognizer *)tap { + if (self.singleTapped) self.singleTapped(self); +} + +- (void)handleDoubleTap:(UITapGestureRecognizer *)tap { + if (self.doubleTapped) self.doubleTapped(self); +} + +- (void)handlePan:(UIPanGestureRecognizer *)pan { + CGPoint translate = [pan translationInView:pan.view]; + CGPoint velocity = [pan velocityInView:pan.view]; + switch (pan.state) { + case UIGestureRecognizerStateBegan: { + self.panMovingDirection = ZFPanMovingDirectionUnkown; + CGFloat x = fabs(velocity.x); + CGFloat y = fabs(velocity.y); + if (x > y) { + self.panDirection = ZFPanDirectionH; + } else { + self.panDirection = ZFPanDirectionV; + } + + if (self.beganPan) self.beganPan(self, self.panDirection, self.panLocation); + } + break; + case UIGestureRecognizerStateChanged: { + switch (_panDirection) { + case ZFPanDirectionH: { + if (translate.x > 0) { + self.panMovingDirection = ZFPanMovingDirectionRight; + } else if (translate.y < 0) { + self.panMovingDirection = ZFPanMovingDirectionLeft; + } + } + break; + case ZFPanDirectionV: { + if (translate.y > 0) { + self.panMovingDirection = ZFPanMovingDirectionBottom; + } else { + self.panMovingDirection = ZFPanMovingDirectionTop; + } + } + break; + case ZFPanDirectionUnknown: + break; + } + if (self.changedPan) self.changedPan(self, self.panDirection, self.panLocation, velocity); + } + break; + case UIGestureRecognizerStateFailed: + case UIGestureRecognizerStateCancelled: + case UIGestureRecognizerStateEnded: { + if (self.endedPan) self.endedPan(self, self.panDirection, self.panLocation); + } + break; + default: + break; + } + [pan setTranslation:CGPointZero inView:pan.view]; +} + +- (void)handlePinch:(UIPinchGestureRecognizer *)pinch { + switch (pinch.state) { + case UIGestureRecognizerStateEnded: { + if (self.pinched) self.pinched(self, pinch.scale); + } + break; + default: + break; + } +} + +@end -- Gitblit v1.8.0