TUIResponderTextView.m 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. //
  2. // TResponderTextView.m
  3. // TUIKit
  4. //
  5. // Created by kennethmiao on 2018/10/25.
  6. // Copyright © 2018 Tencent. All rights reserved.
  7. //
  8. #import "TUIResponderTextView.h"
  9. #import <TIMCommon/NSString+TUIEmoji.h>
  10. @interface TUIResponderTextView ()
  11. @property (nonatomic ,strong) UILabel *placeHolderLabel;
  12. @end
  13. @implementation TUIResponderTextView
  14. - (instancetype)init {
  15. self = [super init];
  16. if (self) {
  17. [[NSNotificationCenter defaultCenter] addObserver:self
  18. selector:@selector(didReceiveTextDidChangeNotification:)
  19. name:UITextViewTextDidChangeNotification
  20. object:self];
  21. [self placeAndLayoutSubviews];
  22. }
  23. return self;
  24. }
  25. - (void)placeAndLayoutSubviews {
  26. [self addSubview:self.placeHolderLabel];
  27. [self.placeHolderLabel mas_makeConstraints:^(MASConstraintMaker *make) {
  28. make.top.equalTo(self).offset(7.0);
  29. make.left.equalTo(self).offset(14.0);
  30. make.right.equalTo(self).offset(-14.0);
  31. }];
  32. }
  33. - (void)dealloc {
  34. [[NSNotificationCenter defaultCenter] removeObserver:self name:UITextViewTextDidChangeNotification object:self];
  35. }
  36. #pragma mark - Notifications
  37. - (void)didReceiveTextDidChangeNotification:(NSNotification *)notification {
  38. self.placeHolderLabel.hidden = self.text.length > 0 ? YES : NO;
  39. }
  40. #pragma mark getter and setter
  41. - (UILabel *)placeHolderLabel {
  42. if (_placeHolderLabel == nil) {
  43. _placeHolderLabel = [[UILabel alloc] init];
  44. _placeHolderLabel.font = self.font;
  45. _placeHolderLabel.textColor = [UIColor lightGrayColor];
  46. _placeHolderLabel.textAlignment = NSTextAlignmentLeft;
  47. _placeHolderLabel.lineBreakMode = NSLineBreakByTruncatingTail;
  48. }
  49. return _placeHolderLabel;
  50. }
  51. - (void)setPlaceHolder:(NSString *)placeHolder {
  52. _placeHolder = placeHolder;
  53. self.placeHolderLabel.text = _placeHolder;
  54. }
  55. - (void)setPlaceHolderColor:(UIColor *)placeHolderColor {
  56. _placeHolderColor = placeHolderColor;
  57. self.placeHolderLabel.textColor = _placeHolderColor;
  58. }
  59. - (UIResponder *)nextResponder {
  60. if (_overrideNextResponder == nil) {
  61. return [super nextResponder];
  62. } else {
  63. return _overrideNextResponder;
  64. }
  65. }
  66. - (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
  67. if (_overrideNextResponder != nil)
  68. return NO;
  69. else
  70. return [super canPerformAction:action withSender:sender];
  71. }
  72. - (void)buildMenuWithBuilder:(id<UIMenuBuilder>)builder API_AVAILABLE(ios(13.0)) {
  73. if (@available(iOS 16.0, *)) {
  74. [builder removeMenuForIdentifier:UIMenuLookup];
  75. }
  76. [super buildMenuWithBuilder:builder];
  77. }
  78. - (void)deleteBackward {
  79. id<TUIResponderTextViewDelegate> delegate = (id<TUIResponderTextViewDelegate>)self.delegate;
  80. if ([delegate respondsToSelector:@selector(onDeleteBackward:)]) {
  81. [delegate onDeleteBackward:self];
  82. }
  83. [super deleteBackward];
  84. }
  85. - (void)setText:(NSString *)text {
  86. [super setText:text];
  87. if (self.delegate && [self.delegate respondsToSelector:@selector(textViewDidChange:)]) {
  88. [self.delegate textViewDidChange:self];
  89. }
  90. }
  91. - (void)copy:(__unused id)sender {
  92. UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
  93. pasteboard.string = [[self.textStorage attributedSubstringFromRange:self.selectedRange] tui_getPlainString];
  94. }
  95. - (void)cut:(nullable id)sender {
  96. UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
  97. pasteboard.string = [[self.textStorage attributedSubstringFromRange:self.selectedRange] tui_getPlainString];
  98. UIFont *textFont = [UIFont systemFontOfSize:16.0];
  99. NSAttributedString *spaceString = [[NSAttributedString alloc] initWithString:@"" attributes:@{NSFontAttributeName : textFont}];
  100. [self.textStorage replaceCharactersInRange:self.selectedRange withAttributedString:spaceString];
  101. }
  102. @end