| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409 |
- //
- // TCVideoTextFiled.m
- // DeviceManageIOSApp
- //
- // Created by rushanting on 2017/5/22.
- // Copyright © 2017年 tencent. All rights reserved.
- //
- #import "TCVideoTextFiled.h"
- //#import "UIView+AdditionsX12.h"
- #import "ColorMacro.h"
- #define kDefaultText @"点击修改文字"
- @interface TCVideoTextFiled () <UITextViewDelegate, UITextFieldDelegate>
- {
- UILabel* _textLabel;
- UIView* _borderView;
- UIButton* _deleteBtn;
- UIButton* _styleBtn;
- UIButton* _scaleRotateBtn;
-
- UITextView* _inputTextView;
- UIButton* _inputConfirmBtn;
-
- UITextField* _hiddenTextField;
- BOOL _isInputting;
-
- //己旋转角度
- CGFloat _rotateAngle;
-
- NSInteger _styleIndex;
- }
- @end
- @implementation TCVideoTextFiled
- - (id)initWithFrame:(CGRect)frame
- {
- if (self = [super initWithFrame:frame]) {
- _styleIndex = 0;
- _textLabel = [UILabel new];
- _textLabel.text = kDefaultText;
- _textLabel.textColor = UIColor.whiteColor;
- _textLabel.shadowOffset = CGSizeMake(2, 2);
- _textLabel.font = [UIFont systemFontOfSize:18];
- _textLabel.numberOfLines = 0;
- UITapGestureRecognizer* singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onTap:)];
- singleTap.numberOfTapsRequired = 1;
- _textLabel.userInteractionEnabled = YES;
- [_textLabel sizeToFit];
- [_textLabel addGestureRecognizer:singleTap];
-
- _borderView = [UIImageView new];
- _borderView.layer.borderWidth = 1;
- _borderView.layer.borderColor = Pink_Cor.CGColor;//UIColorFromRGB(0x0accac).CGColor;
- _borderView.userInteractionEnabled = YES;
- [self addSubview:_borderView];
-
- _deleteBtn = [UIButton new];
- [_deleteBtn setImage:[UIImage imageNamed:@"videotext_delete"] forState:UIControlStateNormal];
- [_deleteBtn addTarget:self action:@selector(onDeleteBtnClicked:) forControlEvents:UIControlEventTouchUpInside];
- [self addSubview:_deleteBtn];
-
- _styleBtn = [UIButton new];
- [_styleBtn setImage:[UIImage imageNamed:@"videotext_style"] forState:UIControlStateNormal];
- [_styleBtn addTarget:self action:@selector(onStyleBtnClicked:) forControlEvents:UIControlEventTouchUpInside];
- [self addSubview:_styleBtn];
-
- _scaleRotateBtn = [UIButton new];
- [_scaleRotateBtn setImage:[UIImage imageNamed:@"videotext_rotate"] forState:UIControlStateNormal];
- UIPanGestureRecognizer* panGensture = [[UIPanGestureRecognizer alloc] initWithTarget:self action: @selector (handlePanSlide:)];
- [self addSubview:_scaleRotateBtn];
- [_scaleRotateBtn addGestureRecognizer:panGensture];
-
- UIView* inputAccessoryView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 40)];
-
- UIView* labelBgView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, inputAccessoryView.width - 40, inputAccessoryView.height)];
- labelBgView.backgroundColor = UIColor.whiteColor;
- labelBgView.alpha = 0.5;
- [inputAccessoryView addSubview:labelBgView];
-
- _inputTextView = [[UITextView alloc] initWithFrame:CGRectMake(10, 0, inputAccessoryView.width - 50, inputAccessoryView.height)];
- _inputTextView.textColor = UIColorFromRGB(0xFFFFFF);
- _inputTextView.font = [UIFont systemFontOfSize:18];
- _inputTextView.textAlignment = NSTextAlignmentLeft;
- _inputTextView.delegate = self;
- _inputTextView.editable = YES;
- _inputTextView.backgroundColor = UIColor.clearColor;
- [inputAccessoryView addSubview:_inputTextView];
-
- _inputConfirmBtn = [[UIButton alloc] initWithFrame:CGRectMake(_inputTextView.right, 0, 40, inputAccessoryView.height)];
- _inputConfirmBtn.backgroundColor =Pink_Cor;// UIColorFromRGB(0x0accac);
- [_inputConfirmBtn setImage:[UIImage imageNamed:@"videotext_confirm"] forState:UIControlStateNormal];
- [_inputConfirmBtn addTarget:self action:@selector(onInputConfirmBtnClicked:) forControlEvents:UIControlEventTouchUpInside];
- [inputAccessoryView addSubview:_inputConfirmBtn];
-
-
- _hiddenTextField = [[UITextField alloc] initWithFrame:CGRectZero];
- _hiddenTextField.inputAccessoryView = inputAccessoryView;
- [self addSubview:_hiddenTextField];
-
- [_borderView addSubview:_textLabel];
-
- UIPanGestureRecognizer* selfPanGensture = [[UIPanGestureRecognizer alloc] initWithTarget:self action: @selector (handlePanSlide:)];
- [self addGestureRecognizer:selfPanGensture];
-
- UIPinchGestureRecognizer* pinchGensture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinch:)];
- [self addGestureRecognizer:pinchGensture];
-
- UIRotationGestureRecognizer* rotateGensture = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(handleRotate:)];
- [self addGestureRecognizer:rotateGensture];
-
- [[NSNotificationCenter defaultCenter] addObserver:self
- selector:@selector(changeFirstResponder)
- name:UIKeyboardDidShowNotification
- object:nil];
-
-
- _rotateAngle = 0.f;
- }
-
- return self;
- }
- - (void)layoutSubviews
- {
- [super layoutSubviews];
-
- CGPoint center = [self convertPoint:self.center fromView:self.superview];
- _borderView.bounds = CGRectMake(0, 0, _textLabel.width + 20, _textLabel.height + 10);
- _borderView.center = center;
-
- _textLabel.center = [_borderView convertPoint:_borderView.center fromView:self];
-
- _deleteBtn.center = CGPointMake(_borderView.x, _borderView.y);
- _deleteBtn.bounds = CGRectMake(0, 0, 30, 30);
-
- _styleBtn.center = CGPointMake(_borderView.right, _borderView.top);
- _styleBtn.bounds = CGRectMake(0, 0, 30, 30);
-
- _scaleRotateBtn.center = CGPointMake(_borderView.right, _borderView.bottom);
- _scaleRotateBtn.bounds = CGRectMake(0, 0, 30, 30);
- }
- - (NSString*)text
- {
- return _textLabel.text;
- }
- //生成字幕图片
- - (UIImage*)textImage
- {
- _borderView.layer.borderWidth = 0;
- [_borderView setNeedsDisplay];
- CGRect rect = _borderView.bounds;
- UIView *rotatedViewBox = [[UIView alloc]initWithFrame:CGRectMake(0, 0, rect.size.width , rect.size.height)];
- CGAffineTransform t = CGAffineTransformMakeRotation(_rotateAngle);
- rotatedViewBox.transform = t;
- CGSize rotatedSize = rotatedViewBox.frame.size;
-
- UIGraphicsBeginImageContextWithOptions(rotatedSize, NO, 0.f);
-
- CGContextRef context = UIGraphicsGetCurrentContext();
- CGContextTranslateCTM(context, rotatedSize.width/2, rotatedSize.height/2);
-
- CGContextRotateCTM(context, _rotateAngle);
-
- //[_textLabel drawTextInRect:CGRectMake(-rect.size.width / 2, -rect.size.height / 2, rect.size.width, rect.size.height)];
- [_borderView drawViewHierarchyInRect:CGRectMake(-rect.size.width / 2, -rect.size.height / 2, rect.size.width, rect.size.height) afterScreenUpdates:YES];
- UIImage *rotatedImg = UIGraphicsGetImageFromCurrentImageContext();
-
- UIGraphicsEndImageContext();
- _borderView.layer.borderWidth = 1;
- _borderView.layer.borderColor = Pink_Cor.CGColor;//UIColorFromRGB(0x0accac).CGColor;
-
- return rotatedImg;
- }
- //字幕图在视频预览view的frame
- - (CGRect)textFrameOnView:(UIView *)view
- {
- CGRect frame = CGRectMake(_borderView.x, _borderView.y, _borderView.bounds.size.width, _borderView.bounds.size.height);
-
- if (![view.subviews containsObject:self]) {
- [view addSubview:self];
- CGRect rc = [self convertRect:frame toView:view];
- [self removeFromSuperview];
- return rc;
- }
-
- return [self convertRect:frame toView:view];
- }
- - (CGRect)textRect
- {
- CGRect rect = [_textLabel.text boundingRectWithSize:CGSizeMake(MAXFLOAT, 0) options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) attributes:@{NSFontAttributeName:_textLabel.font} context:nil];
- //限制最小的文字框大小
- if (rect.size.width < 30) {
- rect.size.width = 30;
- } else if (rect.size.height < 10) {
- rect.size.height = 10;
- }
-
- return rect;
- }
- - (void)resignFirstResponser
- {
- if (!_isInputting)
- return;
-
- _isInputting = NO;
- [_inputTextView resignFirstResponder];
- }
- - (void)changeFirstResponder
- {
- if (_isInputting) {
- //辅助唤出键盘后,键盘上的输入框设为实际输入点
- if ([_textLabel.text isEqualToString:kDefaultText]) {
- _textLabel.text = @"";
- } else {
- _inputTextView.text = _textLabel.text;
- }
- [_inputTextView becomeFirstResponder];
- } else {
- if (_hiddenTextField.isFirstResponder) {
- [_hiddenTextField resignFirstResponder];
- } else {
- [self resignFirstResponder];
- [_hiddenTextField resignFirstResponder];
- }
- }
- }
- #pragma mark - GestureRecognizer handle
- - (void)onTap:(UITapGestureRecognizer*)recognizer
- {
- _isInputting = YES;
- [_hiddenTextField becomeFirstResponder];
- }
- - (void)handlePanSlide:(UIPanGestureRecognizer*)recognizer
- {
- //拖动
- if (recognizer.view == self) {
- CGPoint translation = [recognizer translationInView:self.superview];
- CGPoint center = CGPointMake(recognizer.view.center.x + translation.x,
- recognizer.view.center.y + translation.y);
- if (center.x < 0) {
- center.x = 0;
- }
- else if (center.x > self.superview.width) {
- center.x = self.superview.width;
- }
-
- if (center.y < 0) {
- center.y = 0;
- }
- else if (center.y > self.superview.height) {
- center.y = self.superview.height;
- }
-
- recognizer.view.center = center;
-
- [recognizer setTranslation:CGPointZero inView:self.superview];
-
-
- }
- else if (recognizer.view == _scaleRotateBtn) {
- CGPoint translation = [recognizer translationInView:self];
-
- //放大
- if (recognizer.state == UIGestureRecognizerStateChanged) {
- if (translation.y == 0.0 || fabs(translation.x / translation.y) > 3.0) {
- CGFloat delta = translation.x / 3;
- CGFloat newFontSize = MAX(10.0f, MIN(150.f, _textLabel.font.pointSize + delta));
-
- _textLabel.font = [UIFont systemFontOfSize:newFontSize];
- _textLabel.bounds = [self textRect];
- self.bounds = CGRectMake(0, 0, _textLabel.bounds.size.width + 50, _textLabel.bounds.size.height + 40);
- }
- //旋转
- else {
- CGPoint newCenter = CGPointMake(recognizer.view.center.x + translation.x, recognizer.view.center.y + translation.y);
- CGPoint anthorPoint = _textLabel.center;
- CGFloat height = newCenter.y - anthorPoint.y;
- CGFloat width = newCenter.x - anthorPoint.x;
- CGFloat angle1 = atan(height / width);
- height = recognizer.view.center.y - anthorPoint.y;
- width = recognizer.view.center.x - anthorPoint.x;
- CGFloat angle2 = atan(height / width);
- CGFloat angle = angle1 - angle2;
-
- self.transform = CGAffineTransformRotate(self.transform, angle);
- _rotateAngle += angle;
-
- }
- }
- [recognizer setTranslation:CGPointZero inView:self];
- }
-
- }
- //双手指放大
- - (void)handlePinch:(UIPinchGestureRecognizer*)recognizer
- {
- CGFloat newFontSize = MAX(10.0f, MIN(150.f, _textLabel.font.pointSize * recognizer.scale));
-
- // set font size
- _textLabel.font = [_textLabel.font fontWithSize:newFontSize];
-
- CGRect rect = [self textRect];
- rect = [_textLabel convertRect:rect toView:self];
-
- _textLabel.bounds = CGRectMake(0, 0, rect.size.width, rect.size.height);
- self.bounds = CGRectMake(0, 0, _textLabel.bounds.size.width + 50, _textLabel.bounds.size.height + 40);
-
- recognizer.scale = 1;
- }
- //双手指旋转
- - (void)handleRotate:(UIRotationGestureRecognizer*)recognizer
- {
- recognizer.view.transform = CGAffineTransformRotate(recognizer.view.transform, recognizer.rotation);
-
- _rotateAngle += recognizer.rotation;
- recognizer.rotation = 0;
- }
- #pragma mark - UI event handle
- - (void)onInputConfirmBtnClicked:(UIButton*)sender
- {
- _isInputting = NO;
- [_inputTextView resignFirstResponder];
- [_hiddenTextField resignFirstResponder];
-
- _textLabel.text = _inputTextView.text;
- ;
- _textLabel.bounds = [self textRect];
- self.bounds = CGRectMake(0, 0, _textLabel.bounds.size.width + 50, _textLabel.bounds.size.height + 40);
-
- [self.delegate onTextInputDone:_textLabel.text];
- }
- - (void)onDeleteBtnClicked:(UIButton*)sender
- {
- [self.delegate onRemoveTextField:self];
- [self removeFromSuperview];
- }
- - (void)onStyleBtnClicked:(UIButton*)sender
- {
- //样式设计
- //样式设计
- _styleIndex = (_styleIndex + 1) % 7;
- switch (_styleIndex) {
- case 0: {
- _textLabel.textColor = UIColor.whiteColor;
- _textLabel.shadowColor = nil;
- _borderView.backgroundColor = UIColor.clearColor;
- break;
- }
- case 1: {
- _borderView.backgroundColor = UIColor.blackColor;
- break;
- }
- case 2: {
- _textLabel.textColor = UIColor.blackColor;
- _textLabel.shadowColor = nil;
- _borderView.backgroundColor = UIColor.clearColor;
- break;
- }
- case 3: {
- _borderView.backgroundColor = UIColor.whiteColor;
- break;
- }
- case 4: {
- _textLabel.textColor = UIColor.redColor;
- _textLabel.shadowColor = nil;
- _borderView.backgroundColor = UIColor.clearColor;
- break;
- }
- case 5: {
- _borderView.backgroundColor = UIColor.whiteColor;
- break;
- }
- case 6: {
- _borderView.backgroundColor = UIColor.blackColor;
- break;
- }
-
- default:
- break;
- }
- }
- - (void)dealloc
- {
- [[NSNotificationCenter defaultCenter] removeObserver:self];
- }
- @end
|