// // TResponderTextView.m // TUIKit // // Created by kennethmiao on 2018/10/25. // Copyright © 2018 Tencent. All rights reserved. // #import "TUIResponderTextView.h" #import @interface TUIResponderTextView () @property (nonatomic ,strong) UILabel *placeHolderLabel; @end @implementation TUIResponderTextView - (instancetype)init { self = [super init]; if (self) { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didReceiveTextDidChangeNotification:) name:UITextViewTextDidChangeNotification object:self]; [self placeAndLayoutSubviews]; } return self; } - (void)placeAndLayoutSubviews { [self addSubview:self.placeHolderLabel]; [self.placeHolderLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(self).offset(7.0); make.left.equalTo(self).offset(14.0); make.right.equalTo(self).offset(-14.0); }]; } - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self name:UITextViewTextDidChangeNotification object:self]; } #pragma mark - Notifications - (void)didReceiveTextDidChangeNotification:(NSNotification *)notification { self.placeHolderLabel.hidden = self.text.length > 0 ? YES : NO; } #pragma mark getter and setter - (UILabel *)placeHolderLabel { if (_placeHolderLabel == nil) { _placeHolderLabel = [[UILabel alloc] init]; _placeHolderLabel.font = self.font; _placeHolderLabel.textColor = [UIColor lightGrayColor]; _placeHolderLabel.textAlignment = NSTextAlignmentLeft; _placeHolderLabel.lineBreakMode = NSLineBreakByTruncatingTail; } return _placeHolderLabel; } - (void)setPlaceHolder:(NSString *)placeHolder { _placeHolder = placeHolder; self.placeHolderLabel.text = _placeHolder; } - (void)setPlaceHolderColor:(UIColor *)placeHolderColor { _placeHolderColor = placeHolderColor; self.placeHolderLabel.textColor = _placeHolderColor; } - (UIResponder *)nextResponder { if (_overrideNextResponder == nil) { return [super nextResponder]; } else { return _overrideNextResponder; } } - (BOOL)canPerformAction:(SEL)action withSender:(id)sender { if (_overrideNextResponder != nil) return NO; else return [super canPerformAction:action withSender:sender]; } - (void)buildMenuWithBuilder:(id)builder API_AVAILABLE(ios(13.0)) { if (@available(iOS 16.0, *)) { [builder removeMenuForIdentifier:UIMenuLookup]; } [super buildMenuWithBuilder:builder]; } - (void)deleteBackward { id delegate = (id)self.delegate; if ([delegate respondsToSelector:@selector(onDeleteBackward:)]) { [delegate onDeleteBackward:self]; } [super deleteBackward]; } - (void)setText:(NSString *)text { [super setText:text]; if (self.delegate && [self.delegate respondsToSelector:@selector(textViewDidChange:)]) { [self.delegate textViewDidChange:self]; } } - (void)copy:(__unused id)sender { UIPasteboard *pasteboard = [UIPasteboard generalPasteboard]; pasteboard.string = [[self.textStorage attributedSubstringFromRange:self.selectedRange] tui_getPlainString]; } - (void)cut:(nullable id)sender { UIPasteboard *pasteboard = [UIPasteboard generalPasteboard]; pasteboard.string = [[self.textStorage attributedSubstringFromRange:self.selectedRange] tui_getPlainString]; UIFont *textFont = [UIFont systemFontOfSize:16.0]; NSAttributedString *spaceString = [[NSAttributedString alloc] initWithString:@"" attributes:@{NSFontAttributeName : textFont}]; [self.textStorage replaceCharactersInRange:self.selectedRange withAttributedString:spaceString]; } @end