KKTextView.m 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. //
  2. // KKTextView.m
  3. // WWImageEdit
  4. //
  5. // Created by 邬维 on 2017/1/18.
  6. // Copyright © 2017年 kook. All rights reserved.
  7. //
  8. #import "KKTextView.h"
  9. #import "KKTextTool.h"
  10. #import "KKTextLable.h"
  11. @implementation KKTextView{
  12. UIButton *_deleteButton;
  13. CGPoint _initialPoint;
  14. KKTextLable *_label;
  15. __weak KKTextTool *_tool;
  16. }
  17. + (void)setActiveTextView:(KKTextView*)view
  18. {
  19. static KKTextView *activeView = nil;
  20. if(view != activeView){
  21. [activeView setAvtive:NO];
  22. activeView = view;
  23. [activeView setAvtive:YES];
  24. [activeView.superview bringSubviewToFront:activeView];
  25. }
  26. }
  27. - (id)initWithTool:(KKTextTool*)tool
  28. {
  29. self = [super initWithFrame:CGRectZero];
  30. if(self){
  31. _tool = tool;
  32. _label = [[KKTextLable alloc] init];
  33. [_label setTextColor:[KKImageEditorTheme theme].toolbarTextColor];
  34. _label.numberOfLines = 0;
  35. _label.backgroundColor = [UIColor clearColor];
  36. _label.layer.masksToBounds = YES;
  37. _label.layer.borderColor = [[UIColor darkGrayColor] CGColor];
  38. _label.layer.borderWidth = 1;
  39. _label.layer.cornerRadius = 3;
  40. _label.font = [UIFont systemFontOfSize:30];
  41. _label.lineBreakMode = NSLineBreakByCharWrapping;
  42. [_label setTextColor:_textColor];
  43. _label.textInsets = UIEdgeInsetsMake(0.f, 10, 0.f, 10);
  44. // _label.textAlignment = NSTextAlignmentCenter;
  45. _label.text = @"";
  46. [self addSubview:_label];
  47. [self setLableFrameWithText:_label.text];
  48. self.frame = CGRectMake(0, 0, _label.frame.size.width + 32, _label.frame.size.height + 32);
  49. _deleteButton = [UIButton buttonWithType:UIButtonTypeCustom];
  50. [_deleteButton setImage:[UIImage imageNamed:@"btn_delete"] forState:UIControlStateNormal];
  51. _deleteButton.frame = CGRectMake(0, 0, 32, 32);
  52. _deleteButton.center = _label.frame.origin;
  53. [_deleteButton addTarget:self action:@selector(pushedDeleteBtn:) forControlEvents:UIControlEventTouchUpInside];
  54. [self addSubview:_deleteButton];
  55. [self initGestures];
  56. }
  57. return self;
  58. }
  59. //计算lable的frame
  60. - (void)setLableFrameWithText:(NSString *)text{
  61. CGSize constraint = CGSizeMake(_tool.editor.imageView.frame.size.width - 45,0); //这里是指lable的宽度,下同
  62. NSDictionary *attributes = [[NSDictionary alloc] initWithObjects:@[[UIFont systemFontOfSize:30]] forKeys:@[NSFontAttributeName]];
  63. //计算lable的frame 根据文字计算lable的高度
  64. CGRect size = [text boundingRectWithSize:constraint options:NSStringDrawingUsesLineFragmentOrigin attributes:attributes context:nil];
  65. _label.frame = CGRectMake(16, 16, _tool.editor.imageView.frame.size.width - 45, size.size.height);
  66. }
  67. - (void)initGestures
  68. {
  69. _label.userInteractionEnabled = YES;
  70. [_label addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(viewDidTap:)]];
  71. [_label addGestureRecognizer:[[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(viewDidPan:)]];
  72. }
  73. - (void)setAvtive:(BOOL)active
  74. {
  75. _deleteButton.hidden = !active;
  76. if (active) {
  77. _label.layer.borderColor = [[UIColor darkGrayColor] CGColor];
  78. }else{
  79. _label.layer.borderColor = [[UIColor clearColor] CGColor];
  80. }
  81. }
  82. - (void)setLableText:(NSString *)text{
  83. if ([text isEqualToString:@""]) {
  84. [self removeFromSuperview];
  85. return;
  86. }
  87. _label.text = text;
  88. [_label setTextColor:_textColor];
  89. [self setLableFrameWithText:text];
  90. self.frame = CGRectMake(0, 0, _label.frame.size.width + 32, _label.frame.size.height + 32);
  91. }
  92. - (NSString *)getLableText{
  93. return _label.text;
  94. }
  95. #pragma mark- gesture events
  96. - (void)pushedDeleteBtn:(id)sender
  97. {
  98. KKTextView *nextTarget = nil;
  99. const NSInteger index = [self.superview.subviews indexOfObject:self];
  100. for(NSInteger i=index+1; i<self.superview.subviews.count; ++i){
  101. UIView *view = [self.superview.subviews objectAtIndex:i];
  102. if([view isKindOfClass:[KKTextView class]]){
  103. nextTarget = (KKTextView*)view;
  104. break;
  105. }
  106. }
  107. if(nextTarget==nil){
  108. for(NSInteger i=index-1; i>=0; --i){
  109. UIView *view = [self.superview.subviews objectAtIndex:i];
  110. if([view isKindOfClass:[KKTextView class]]){
  111. nextTarget = (KKTextView*)view;
  112. break;
  113. }
  114. }
  115. }
  116. [[self class] setActiveTextView:nextTarget];
  117. [self removeFromSuperview];
  118. }
  119. - (void)viewDidTap:(UITapGestureRecognizer*)sender
  120. {
  121. if(!_deleteButton.hidden){
  122. _tool.selectedTextView = self;
  123. NSNotification *n = [NSNotification notificationWithName:kTextViewActiveViewDidTapNotification object:self userInfo:nil];
  124. [[NSNotificationCenter defaultCenter] performSelectorOnMainThread:@selector(postNotification:) withObject:n waitUntilDone:NO];
  125. }
  126. [[self class] setActiveTextView:self];
  127. }
  128. - (void)viewDidPan:(UIPanGestureRecognizer*)sender
  129. {
  130. [[self class] setActiveTextView:self];
  131. CGPoint p = [sender translationInView:self.superview];
  132. if(sender.state == UIGestureRecognizerStateBegan){
  133. _initialPoint = self.center;
  134. }
  135. self.center = CGPointMake(_initialPoint.x + p.x, _initialPoint.y + p.y);
  136. }
  137. @end