123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788 |
- //
- // KZVideoSupport.m
- // KZWeChatSmallVideo_OC
- //
- // Created by HouKangzhu on 16/7/19.
- // Copyright © 2016年 侯康柱. All rights reserved.
- //
- #import "KZVideoSupport.h"
- #import "KZVideoConfig.h"
- #import "WFCUImage.h"
- #pragma mark - Custom View --
- @implementation KZStatusBar {
- BOOL _clear;
- CAShapeLayer *_nomalLayer;
- CALayer *_recodingLayer;
-
- KZVideoViewShowType _style;
-
- UIButton *_cancelBtn;
- }
- - (instancetype)initWithFrame:(CGRect)frame style:(KZVideoViewShowType)style; {
- if (self = [super initWithFrame:frame]) {
- _style = style;
- //[KZVideoConfig motionBlurView:self];
- self.backgroundColor = [UIColor clearColor];
- [self setupSubLayers];
- }
- return self;
- }
- - (void)addCancelTarget:(id)target selector:(SEL)selector {
- [_cancelBtn removeFromSuperview];
-
- _cancelBtn = [UIButton buttonWithType:UIButtonTypeCustom];
- _cancelBtn.frame = CGRectMake(10, 22, 50, 40);
- [_cancelBtn setTitle:WFCString(@"Cancel") forState:UIControlStateNormal];
- [_cancelBtn addTarget:target action:selector forControlEvents:UIControlEventTouchUpInside];
- [_cancelBtn setTitleColor:kzThemeTineColor forState:UIControlStateNormal];
- _cancelBtn.alpha = 0.8;
- _cancelBtn.backgroundColor = [UIColor clearColor];
- [self addSubview:_cancelBtn];
- }
- - (void)setupSubLayers {
-
- if (_style == KZVideoViewShowTypeSingle) {
- return;
- }
-
- UIView *showView = [[UIView alloc] initWithFrame:self.bounds];
- showView.backgroundColor = [UIColor clearColor];
- [self addSubview:showView];
-
- CGAffineTransform transform = CGAffineTransformIdentity;
-
- CGFloat barW = 20.0;
- CGFloat barSpace = 4.0;
- CGFloat topEdge = 5.5;
- CGPoint selfCent = CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2);
- CGMutablePathRef nomalPath = CGPathCreateMutable();
- for (int i=0; i<3; i++) {
- CGPathMoveToPoint(nomalPath, &transform, selfCent.x-(barW/2), topEdge+(barSpace * i));
- CGPathAddLineToPoint(nomalPath, &transform, selfCent.x+(barW/2), topEdge+(barSpace * i));
- }
- _nomalLayer = [CAShapeLayer layer];
- _nomalLayer.frame = self.bounds;
- _nomalLayer.strokeColor = [UIColor colorWithRed: 0.5 green: 0.5 blue: 0.5 alpha: 0.7 ].CGColor;
- _nomalLayer.lineCap = kCALineCapRound;
- _nomalLayer.lineWidth = 2.0;
- _nomalLayer.path = nomalPath;
- [showView.layer addSublayer:_nomalLayer];
- CGPathRelease(nomalPath);
-
- CGFloat width = 10;
- CGFloat height = 8;
- _recodingLayer = [CALayer layer];
- _recodingLayer.frame = CGRectMake(selfCent.x - width/2, selfCent.y - height/2, width, height);
- _recodingLayer.cornerRadius = height/2;
- _recodingLayer.masksToBounds = YES;
- _recodingLayer.backgroundColor = kzThemeWaringColor.CGColor;
- [showView.layer addSublayer:_recodingLayer];
-
- _recodingLayer.hidden = YES;
- }
- - (void)setIsRecoding:(BOOL)isRecoding {
- _isRecoding = isRecoding;
-
- [self display];
- }
- - (void)display {
- if (_style == KZVideoViewShowTypeSingle) {
- return;
- }
-
- if (_isRecoding) {
- _recodingLayer.hidden = NO;
- _nomalLayer.hidden = YES;
- kz_dispatch_after(0.5, ^{
- if (!_isRecoding) return;
- _recodingLayer.hidden = YES;
- _nomalLayer.hidden = YES;
- });
- }
- else {
- _nomalLayer.hidden = NO;
- _recodingLayer.hidden = YES;
- }
- }
- @end
- @implementation KZCloseBtn
- - (void)setGradientColors:(NSArray *)gradientColors {
- self.backgroundColor = [UIColor clearColor];
- _gradientColors = gradientColors;
-
- CAShapeLayer *trackLayer = [CAShapeLayer layer];
- trackLayer.frame = self.bounds;
- trackLayer.strokeColor = kzThemeTineColor.CGColor;
- trackLayer.fillColor = [UIColor clearColor].CGColor;
- trackLayer.lineCap = kCALineCapRound;
- trackLayer.lineWidth = 3.0;
-
- CGMutablePathRef path = [self getDrawPath];
- trackLayer.path = path;
- [self.layer addSublayer:trackLayer];
- CGPathRelease(path);
-
- CAGradientLayer *maskLayer = [CAGradientLayer layer];
- maskLayer.frame = self.bounds;
- maskLayer.colors = _gradientColors;
- [self.layer addSublayer:maskLayer];
- maskLayer.mask = trackLayer;
- [self setNeedsDisplay];
- }
- - (void)drawRect:(CGRect)rect {
- [super drawRect:rect];
- if (_gradientColors != nil) {
- return;
- }
-
- CGContextRef context = UIGraphicsGetCurrentContext();
- CGContextSetAllowsAntialiasing(context, YES);
- CGContextSetStrokeColorWithColor(context, kzThemeGraryColor.CGColor);
- CGContextSetLineWidth(context, 3.0);
- CGContextSetLineCap(context, kCGLineCapRound);
- CGMutablePathRef path = [self getDrawPath];
- CGContextAddPath(context, path);
- CGContextDrawPath(context, kCGPathStroke);
- CGPathRelease(path);
- }
- - (CGMutablePathRef)getDrawPath {
- CGMutablePathRef path = CGPathCreateMutable();
- CGFloat centX = self.bounds.size.width/2;
- CGFloat centY = self.bounds.size.height/2;
- CGFloat drawWidth = 22;
- CGFloat drawHeight = 10;
- CGPathMoveToPoint(path, NULL, (centX - drawWidth/2), (centY - drawHeight/2));
- CGPathAddLineToPoint(path, NULL, centX, centY + drawHeight/2);
- CGPathAddLineToPoint(path, NULL, centX + drawWidth/2, centY - drawHeight/2);
- return path;
- }
- @end
- @implementation KZRecordBtn {
- UITapGestureRecognizer *_tapGesture;
- KZVideoViewShowType _style;
- }
- - (instancetype)initWithFrame:(CGRect)frame style:(KZVideoViewShowType)style{
- if (self = [super initWithFrame:frame]) {
- _style = style;
- [self setupRoundButton];
- // self.backgroundColor = [UIColor whiteColor];
- self.layer.cornerRadius = self.bounds.size.width/2;
- self.layer.masksToBounds = YES;
- // self.layer.borderWidth = 0.5f;
- // self.layer.borderColor = [[UIColor blackColor] CGColor];
- self.userInteractionEnabled = YES;
- }
- return self;
- }
- - (void)setupRoundButton {
- self.backgroundColor = [UIColor clearColor];
-
- CGFloat width = self.frame.size.width;
- UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:width/2];
-
- CAShapeLayer *trackLayer = [CAShapeLayer layer];
- trackLayer.frame = self.bounds;
- trackLayer.strokeColor = kzThemeTineColor.CGColor;
- trackLayer.fillColor = [UIColor clearColor].CGColor;
- trackLayer.opacity = 1.0;
- trackLayer.lineCap = kCALineCapRound;
- trackLayer.lineWidth = 2.0;
- trackLayer.path = path.CGPath;
- [self.layer addSublayer:trackLayer];
-
- if (_style == KZVideoViewShowTypeSingle) {
- CATextLayer *textLayer = [CATextLayer layer];
- textLayer.string = @"按住拍";
- textLayer.frame = CGRectMake(0, 0, 120, 30);
- textLayer.position = CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2);
- UIFont *font = [UIFont boldSystemFontOfSize:22];
- CFStringRef fontName = (__bridge CFStringRef)font.fontName;
- CGFontRef fontRef = CGFontCreateWithFontName(fontName);
- textLayer.font = fontRef;
- textLayer.fontSize = font.pointSize;
- CGFontRelease(fontRef);
- textLayer.contentsScale = [UIScreen mainScreen].scale;
- textLayer.foregroundColor = kzThemeTineColor.CGColor;
- textLayer.alignmentMode = kCAAlignmentCenter;
- textLayer.wrapped = YES;
- [trackLayer addSublayer:textLayer];
- }
-
- CAGradientLayer *gradLayer = [CAGradientLayer layer];
- gradLayer.frame = self.bounds;
- gradLayer.colors = [KZVideoConfig gradualColors];
- [self.layer addSublayer:gradLayer];
-
- gradLayer.mask = trackLayer;
- }
- @end
- @implementation KZFocusView {
- CGFloat _width;
- CGFloat _height;
- }
- - (instancetype)initWithFrame:(CGRect)frame {
- if (self = [super initWithFrame:frame]) {
- _width = CGRectGetWidth(frame);
- _height = _width;
- }
- return self;
-
- }
- - (void)focusing {
- [UIView animateWithDuration:0.5 animations:^{
-
- self.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.8, 0.8);
- } completion:^(BOOL finished) {
- self.transform = CGAffineTransformIdentity;
- }];
- }
- - (void)drawRect:(CGRect)rect {
- [super drawRect:rect];
- CGContextRef context = UIGraphicsGetCurrentContext();
- CGContextSetStrokeColorWithColor(context, kzThemeTineColor.CGColor);
- CGContextSetLineWidth(context, 1.0);
-
- CGFloat len = 4;
-
- CGContextMoveToPoint(context, 0.0, 0.0);
- CGContextAddRect(context, self.bounds);
-
- CGContextMoveToPoint(context, 0, _height/2);
- CGContextAddLineToPoint(context, len, _height/2);
-
- CGContextMoveToPoint(context, _width/2, _height);
- CGContextAddLineToPoint(context, _width/2, _height - len);
-
- CGContextMoveToPoint(context, _width, _height/2);
- CGContextAddLineToPoint(context, _width - len, _height/2);
-
- CGContextMoveToPoint(context, _width/2, 0);
- CGContextAddLineToPoint(context, _width/2, len);
-
- CGContextDrawPath(context, kCGPathStroke);
- }
- @end
- @implementation KZEyeView
- - (instancetype)initWithFrame:(CGRect)frame {
- if (self = [super initWithFrame:frame]) {
-
- [KZVideoConfig motionBlurView:self];
-
- [self setupView];
- }
- return self;
- }
- - (instancetype)initWithCoder:(NSCoder *)aDecoder {
- if (self = [super initWithCoder:aDecoder]) {
- [self layoutIfNeeded];
- [KZVideoConfig motionBlurView:self];
- [self setupView];
- }
- return self;
- }
- - (void)setupView {
- UIView *view = [[UIView alloc] initWithFrame:self.bounds];
- view.backgroundColor = [UIColor clearColor];
- [self addSubview:view];
-
- KZEyePath path = createEyePath(self.bounds);
- UIColor *color = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:0.9];
-
- CAShapeLayer *shapelayer1 = [CAShapeLayer layer];
- shapelayer1.frame = self.bounds;
- shapelayer1.strokeColor = color.CGColor;
- shapelayer1.fillColor = [UIColor clearColor].CGColor;
- shapelayer1.opacity = 1.0;
- shapelayer1.lineCap = kCALineCapRound;
- shapelayer1.lineWidth = 1.0;
- shapelayer1.path = path.strokePath;
- [view.layer addSublayer:shapelayer1];
-
- CAShapeLayer *shapelayer2 = [CAShapeLayer layer];
- shapelayer2.frame = self.bounds;
- shapelayer2.strokeColor = color.CGColor;
- shapelayer2.fillColor = color.CGColor;
- shapelayer2.opacity = 1.0;
- shapelayer2.lineCap = kCALineCapRound;
- shapelayer2.lineWidth = 1.0;
- shapelayer2.path = path.fillPath;
- [view.layer addSublayer:shapelayer2];
-
- KZEyePathRelease(path);
- }
- /*
- - (void)drawRect:(CGRect)rect {
- [super drawRect:rect];
- return;
-
- KZEyePath path = createEyePath(self.bounds);
-
- CGContextRef context = UIGraphicsGetCurrentContext();
- UIColor *color = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:0.9];
- [color setStroke];
- [color setFill];
- CGContextSetLineWidth(context, 1.0);
- CGContextSetLineCap(context, kCGLineCapRound);
- CGContextAddPath(context, path.strokePath);
- CGContextDrawPath(context, kCGPathStroke);
-
- CGContextAddPath(context, path.fillPath);
- CGContextDrawPath(context, kCGPathFillStroke);
-
- KZEyePathRelease(path);
- }
- */
- typedef struct eyePath {
- CGMutablePathRef strokePath;
- CGMutablePathRef fillPath;
- } KZEyePath;
- void KZEyePathRelease(KZEyePath path) {
- CGPathRelease(path.fillPath);
- CGPathRelease(path.strokePath);
- }
- KZEyePath createEyePath(CGRect rect) {
- CGPoint selfCent = CGPointMake(CGRectGetWidth(rect)/2, CGRectGetHeight(rect)/2);
- CGFloat eyeWidth = 64.0;
- CGFloat eyeHeight = 40.0;
- CGFloat curveCtrlH = 44;
-
- CGAffineTransform transform = CGAffineTransformMakeScale(1.0, 1.0);
-
- CGMutablePathRef path = CGPathCreateMutable();
- CGPathMoveToPoint(path, &transform, selfCent.x - eyeWidth/2, selfCent.y);
- CGPathAddQuadCurveToPoint(path, &transform, selfCent.x, selfCent.y - curveCtrlH, selfCent.x + eyeWidth/2, selfCent.y);
- CGPathAddQuadCurveToPoint(path, &transform, selfCent.x, selfCent.y + curveCtrlH, selfCent.x - eyeWidth/2, selfCent.y);
- CGFloat arcRadius = eyeHeight/2 - 1;
- CGPathMoveToPoint(path, &transform, selfCent.x + arcRadius, selfCent.y);
- CGPathAddArc(path, &transform, selfCent.x, selfCent.y, arcRadius, 0, M_PI * 2, false);
-
- CGFloat startAngle = 110;
- CGFloat angle1 = startAngle + 30;
- CGFloat angle2 = angle1 + 20;
- CGFloat angle3 = angle2 + 10;
- CGFloat arcRadius2 = arcRadius - 4;
- CGFloat arcRadius3 = arcRadius2 - 7;
-
- CGMutablePathRef path2 = createDonutPath(selfCent, angleToRadian(startAngle), angleToRadian(angle1), arcRadius2, arcRadius3, &transform);
- CGMutablePathRef path3 = createDonutPath(selfCent, angleToRadian(angle2), angleToRadian(angle3), arcRadius2, arcRadius3, &transform);
- CGPathAddPath(path2, NULL, path3);
-
- CGPathRelease(path3);
- return (KZEyePath){path, path2};
- }
- // angle 逆时针角度
- CGMutablePathRef createDonutPath(CGPoint center, CGFloat startAngle, CGFloat endAngle, CGFloat bigRadius, CGFloat smallRadius, CGAffineTransform * transform) {
- CGFloat arcStart = M_PI*2 - startAngle;
- CGFloat arcEnd = M_PI*2 - endAngle;
- CGMutablePathRef path = CGPathCreateMutable();
- CGPathMoveToPoint(path, transform, center.x + bigRadius * cos(startAngle), center.y - bigRadius * sin(startAngle));
- CGPathAddArc(path, transform, center.x, center.y, bigRadius, arcStart, arcEnd, true);
- CGPathAddLineToPoint(path, transform, center.x + smallRadius * cos(endAngle), center.y - smallRadius * sin(endAngle));
- CGPathAddArc(path, transform, center.x, center.y, smallRadius, arcEnd, arcStart, false);
- CGPathAddLineToPoint(path, transform, center.x + bigRadius * cos(startAngle), center.y - bigRadius * sin(startAngle));
- return path;
- }
- double kz_sin(double angle) {
- return sin(angleToRadian(angle));
- }
- double kz_cos(double angle) {
- return cos(angleToRadian(angle));
- }
- CGFloat angleToRadian(CGFloat angle) {
- return angle/180.0*M_PI;
- }
- @end
- #pragma mark -------------- 分割线 --------------------------
- @implementation KZControllerBar {
- KZRecordBtn *_startBtn;
- UILongPressGestureRecognizer *_longPress;
- UIView *_progressLine;
- BOOL _touchIsInside;
- BOOL _recording;
-
- NSTimer *_timer;
- NSTimeInterval _surplusTime;
-
- UIButton *_videoListBtn;
- KZCloseBtn *_closeVideoBtn;
-
- BOOL _videoDidEnd;
- }
- - (void)setupSubViewsWithStyle:(KZVideoViewShowType)style {
- [self layoutIfNeeded];
- // [KZVideoConfig motionBlurView:self];
-
- CGFloat selfHeight = self.bounds.size.height;
- CGFloat selfWidth = self.bounds.size.width;
- CGFloat edge = 20.0;
- CGFloat startBtnWidth = style == KZVideoViewShowTypeSmall ? selfHeight - (edge * 2) : selfHeight/2;
-
- _startBtn = [[KZRecordBtn alloc] initWithFrame:CGRectMake(0, 0, startBtnWidth, startBtnWidth) style:style];
- _startBtn.center = CGPointMake(selfWidth/2, selfHeight/2);
- [self addSubview:_startBtn];
-
- _longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longpressAction:)];
- // _longPress.minimumPressDuration = 0.01;
- _longPress.delegate = self;
- [self addGestureRecognizer:_longPress];
- [self addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)]];
-
- _progressLine = [[UIView alloc] initWithFrame:CGRectMake(0, self.bounds.size.height - 8, selfWidth, 4)];
- _progressLine.backgroundColor = kzThemeTineColor;
- _progressLine.hidden = YES;
- [self addSubview:_progressLine];
-
- _surplusTime = kzRecordTime;
-
-
- if (style == KZVideoViewShowTypeSingle) {
- return;
- }
-
- _videoListBtn = [UIButton buttonWithType:UIButtonTypeCustom];
- _videoListBtn.frame = CGRectMake(edge, edge+startBtnWidth/6, startBtnWidth/4*3, startBtnWidth/3*2);
- _videoListBtn.layer.cornerRadius = 8;
- _videoListBtn.imageView.contentMode = UIViewContentModeScaleAspectFill;
- _videoListBtn.layer.masksToBounds = YES;
- [_videoListBtn addTarget:self action:@selector(videoListAction) forControlEvents:UIControlEventTouchUpInside];
- // self.videoListBtn.backgroundColor = kzThemeTineColor
- [self addSubview:_videoListBtn];
-
- NSArray<KZVideoModel *> *videoList = [KZVideoUtil getSortVideoList];
- if (videoList.count == 0) {
- _videoListBtn.hidden = YES;
- }
- else {
- [_videoListBtn setBackgroundImage:[UIImage imageWithContentsOfFile:videoList[0].thumAbsolutePath] forState: UIControlStateNormal];
- }
-
- CGFloat closeBtnWidth = _videoListBtn.frame.size.height;
- _closeVideoBtn = [KZCloseBtn buttonWithType:UIButtonTypeCustom];
- _closeVideoBtn.frame = CGRectMake(self.bounds.size.width - closeBtnWidth - edge, CGRectGetMinY(_videoListBtn.frame), closeBtnWidth, closeBtnWidth);
- [_closeVideoBtn addTarget:self action:@selector(videoCloseAction) forControlEvents:UIControlEventTouchUpInside];
- [self addSubview:_closeVideoBtn];
- [self setBackgroundColor:[UIColor clearColor]];
- }
- - (void)startRecordSet {
- _startBtn.alpha = 1.0;
-
- _progressLine.frame = CGRectMake(0, self.bounds.size.height - 8, self.bounds.size.width, 4);
- _progressLine.backgroundColor = kzThemeTineColor;
- _progressLine.hidden = NO;
-
- _surplusTime = kzRecordTime;
- _recording = YES;
-
- _videoDidEnd = NO;
-
- if (_timer == nil) {
- _timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(recordTimerAction) userInfo:nil repeats:YES];
- [[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSDefaultRunLoopMode];
- }
- [_timer fire];
-
- [UIView animateWithDuration:0.4 animations:^{
- _startBtn.alpha = 0.0;
- _startBtn.transform = CGAffineTransformScale(CGAffineTransformIdentity, 2.0, 2.0);
- } completion:^(BOOL finished) {
- if (finished) {
- _startBtn.transform = CGAffineTransformIdentity;
- }
- }];
- }
- - (void)endRecordSet {
- _progressLine.hidden = YES;
- [_timer invalidate];
- _timer = nil;
- _recording = NO;
- _startBtn.alpha = 1;
- }
- #pragma mark - UIGestureRecognizerDelegate
- - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
- if (gestureRecognizer == _longPress) {
- if (_surplusTime <= 0) return NO;
-
- CGPoint point = [gestureRecognizer locationInView:self];
- CGPoint startBtnCent = _startBtn.center;
-
- CGFloat dx = point.x - startBtnCent.x;
- CGFloat dy = point.y - startBtnCent.y;
-
- CGFloat startWidth = _startBtn.bounds.size.width;
- if ((dx * dx) + (dy * dy) < (startWidth * startWidth)) {
- return YES;
- }
- return NO;
- }
- return YES;
- }
- #pragma mark - Actions --
- - (void)longpressAction:(UILongPressGestureRecognizer *)gesture {
- CGPoint point = [gesture locationInView:self];
- _touchIsInside = point.y >= 0;
- switch (gesture.state) {
- case UIGestureRecognizerStateBegan: {
- [self videoStartAction];
- }
- break;
- case UIGestureRecognizerStateChanged: {
- if (!_touchIsInside) {
- _progressLine.backgroundColor = kzThemeWaringColor;
- if (_delegate && [_delegate respondsToSelector:@selector(ctrollVideoWillCancel:)]) {
- [_delegate ctrollVideoWillCancel:self];
- }
- }
- else {
- _progressLine.backgroundColor = kzThemeTineColor;
- }
- }
- break;
- case UIGestureRecognizerStateEnded: {
- [self endRecordSet];
- if (!_touchIsInside || kzRecordTime - _surplusTime <= 1) {
- KZRecordCancelReason reason = KZRecordCancelReasonTimeShort;
- if (!_touchIsInside) {
- reason = KZRecordCancelReasonDefault;
- }
- [self videoCancelAction:reason];
- }
- else {
- [self videoEndAction];
- }
- }
- break;
- case UIGestureRecognizerStateCancelled:
- break;
- default:
- break;
- }
- }
- - (void)tapAction:(id)sender {
- if (_delegate && [_delegate respondsToSelector:@selector(ctrollImageDidCapture:)]) {
- [_delegate ctrollImageDidCapture:self];
- }
- }
- - (void)videoStartAction {
- [self startRecordSet];
- if (_delegate && [_delegate respondsToSelector:@selector(ctrollVideoDidStart:)]) {
- [_delegate ctrollVideoDidStart:self];
- }
- }
- - (void)videoCancelAction:(KZRecordCancelReason)reason {
- if (_delegate && [_delegate respondsToSelector:@selector(ctrollVideoDidCancel:reason:)]) {
- [_delegate ctrollVideoDidCancel:self reason:reason];
- }
- }
- - (void)videoEndAction {
-
- if (_videoDidEnd) return;
-
- _videoDidEnd = YES;
- if (_delegate && [_delegate respondsToSelector:@selector(ctrollVideoDidEnd:)]) {
- [_delegate ctrollVideoDidEnd:self];
- }
- }
- - (void)videoListAction {
- if (_delegate && [_delegate respondsToSelector:@selector(ctrollVideoOpenVideoList:)]) {
- [_delegate ctrollVideoOpenVideoList:self];
- }
- }
- - (void)videoCloseAction {
- if (_delegate && [_delegate respondsToSelector:@selector(ctrollVideoDidClose:)]) {
- [_delegate ctrollVideoDidClose:self];
- }
- }
- - (void)recordTimerAction {
- CGFloat reduceLen = self.bounds.size.width/kzRecordTime;
- CGFloat oldLineLen = _progressLine.frame.size.width;
- CGRect oldFrame = _progressLine.frame;
-
- [UIView animateWithDuration:1.0 delay: 0.0 options: UIViewAnimationOptionCurveLinear animations:^{
- _progressLine.frame = CGRectMake(oldFrame.origin.x, oldFrame.origin.y, oldLineLen - reduceLen, oldFrame.size.height);
- _progressLine.center = CGPointMake(self.bounds.size.width/2, oldFrame.origin.y-2);
- } completion:^(BOOL finished) {
- _surplusTime --;
- if (_recording) {
- if (_delegate && [_delegate respondsToSelector:@selector(ctrollVideoDidRecordSEC:)]) {
- [_delegate ctrollVideoDidRecordSEC:self];
- }
- }
- if (_surplusTime <= 0.0) {
- [self endRecordSet];
- [self videoEndAction];
- }
- }];
- }
- @end
- #pragma mark - ********************** Video List 控件 ************************
- @implementation KZCircleCloseBtn
- - (void)drawRect:(CGRect)rect {
- [super drawRect:rect];
-
- self.layer.backgroundColor = [UIColor whiteColor].CGColor;
- self.layer.cornerRadius = self.bounds.size.width/2;
- self.layer.masksToBounds = YES;
-
- CGContextRef context = UIGraphicsGetCurrentContext();
- CGContextSetAllowsAntialiasing(context, YES);
- CGContextSetStrokeColorWithColor(context, kzThemeBlackColor.CGColor);
- CGContextSetLineWidth(context, 1.0);
- CGContextSetLineCap(context, kCGLineCapRound);
-
- CGPoint selfCent = CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2);
- CGFloat closeWidth = 8.0;
-
- CGContextMoveToPoint(context, selfCent.x-closeWidth/2, selfCent.y - closeWidth/2);
- CGContextAddLineToPoint(context, selfCent.x + closeWidth/2, selfCent.y + closeWidth/2);
-
- CGContextMoveToPoint(context, selfCent.x-closeWidth/2, selfCent.y + closeWidth/2);
- CGContextAddLineToPoint(context, selfCent.x + closeWidth/2, selfCent.y - closeWidth/2);
-
- CGContextDrawPath(context, kCGPathStroke);
- }
- @end
- @implementation KZVideoListCell {
- UIImageView *_thumImage;
- KZCircleCloseBtn *_closeBtn;
- }
- - (instancetype)initWithFrame:(CGRect)frame {
- if (self = [super initWithFrame:frame]) {
-
- _thumImage = [[UIImageView alloc] initWithFrame:CGRectMake(4, 4, self.bounds.size.width - 8, self.bounds.size.height - 8)];
- _thumImage.layer.cornerRadius = 6.0;
- _thumImage.layer.masksToBounds = YES;
- _thumImage.contentMode = UIViewContentModeScaleAspectFill;
- [self.contentView addSubview:_thumImage];
-
- _closeBtn = [[KZCircleCloseBtn alloc] initWithFrame:CGRectMake(0, 0, 22, 22)];
- [_closeBtn addTarget:self action:@selector(deleteAction) forControlEvents:UIControlEventTouchUpInside];
- [self.contentView addSubview:_closeBtn];
- _closeBtn.hidden = YES;
-
- }
- return self;
- }
- - (void)setVideoModel:(KZVideoModel *)videoModel {
- _videoModel = videoModel;
- _thumImage.image = [WFCUImage imageNamed:videoModel.thumAbsolutePath];
- // [UIImage imageWithContentsOfFile:videoModel.totalThumPath];
- }
- - (void)setEdit:(BOOL)canEdit {
- _closeBtn.hidden = !canEdit;
- }
- - (void)deleteAction {
- if (self.deleteVideoBlock) {
- self.deleteVideoBlock(self.videoModel);
- }
- }
- @end
- @implementation KZAddNewVideoCell
- - (instancetype)initWithFrame:(CGRect)frame {
- if (self = [super initWithFrame:frame]) {
- [self setupView];
- }
- return self;
- }
- - (void)setupView {
- CALayer *bgLayer = [CALayer layer];
- bgLayer.frame = CGRectMake(4, 4, self.bounds.size.width - 8, self.bounds.size.height - 8);
- bgLayer.backgroundColor = [UIColor colorWithRed: 0.5 green: 0.5 blue: 0.5 alpha: 0.3].CGColor;
- bgLayer.cornerRadius = 8.0;
- bgLayer.masksToBounds = YES;
- [self.contentView.layer addSublayer:bgLayer];
-
- CGPoint selfCent = CGPointMake(bgLayer.bounds.size.width/2, bgLayer.bounds.size.height/2);
- CGFloat len = 20;
- CGMutablePathRef path = CGPathCreateMutable();
- CGPathMoveToPoint(path, nil, selfCent.x, selfCent.y - len);
- CGPathAddLineToPoint(path, nil, selfCent.x, selfCent.y + len);
-
- CGPathMoveToPoint(path, nil, selfCent.x - len, selfCent.y);
- CGPathAddLineToPoint(path, nil, selfCent.x + len, selfCent.y);
-
- CAShapeLayer *crossLayer = [CAShapeLayer layer];
- crossLayer.fillColor = [UIColor clearColor].CGColor;
- crossLayer.strokeColor = kzThemeGraryColor.CGColor;
- crossLayer.lineWidth = 4.0;
- crossLayer.path = path;
- crossLayer.opacity = 1.0;
- [bgLayer addSublayer:crossLayer];
- CGPathRelease(path);
- }
- - (void)dealloc {
- // NSLog(@"cell add dealloc");
- }
- @end
|