You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

168 lines
5.3 KiB

//
// CXCustomTextView.m
// CXTextView_Example
//
// Created by caixiang on 2019/5/6.
// Copyright © 2019年 616704162@qq.com. All rights reserved.
//
#import "CXCustomTextView.h"
#import "TFKeyboardManager.h"
@interface CXCustomTextView()
#pragma mark - Data Perproty
@property (nonatomic, assign) BOOL isNameTextFieldEnbable;
@end
@implementation CXCustomTextView
#pragma mark - life Cycle
-(instancetype)initWithCoder:(NSCoder *)aDecoder{
self = [super initWithCoder:aDecoder];
if (self) {
[self initilize];
}
return self;
}
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
[self initilize];
}
return self;
}
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
[self removeObserver:self forKeyPath:@"text"];
}
- (void)drawRect:(CGRect)rect{
if (self.hasText) return;
// 文字属性
NSMutableDictionary *attrs = [NSMutableDictionary dictionary];
attrs[NSFontAttributeName] = self.font;
attrs[NSForegroundColorAttributeName] = self.placeholderColor?self.placeholderColor:[UIColor grayColor];
// 画文字
CGFloat x = self.placePoint.x;
CGFloat w = rect.size.width - 2 * x;
CGFloat y = self.placePoint.y;
CGFloat h = rect.size.height - 2 * y;
CGRect placeholderRect = CGRectMake(x, y, w, h);
[self.placeholder drawInRect:placeholderRect withAttributes:attrs];
}
#pragma mark - NSNotification
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{
//返回删除键
if ([text isEqualToString:@"\n"]) {
//切换下一个
return NO;
}
if ([text isEqualToString:@""]) {
return YES;
}else{
return _isNameTextFieldEnbable;
}
}
#pragma mark - Notification
/**
* 监听文字改变
*/
- (void)textDidChange:(NSNotification *)notification {
self.isNameTextFieldEnbable = YES;
UITextInputMode *mode = (UITextInputMode *)[UITextInputMode activeInputModes][0];
NSString *lang = mode.primaryLanguage;
//汉字
if ([lang isEqualToString:@"zh-Hans"]) {
UITextRange *selectedRange = [self markedTextRange];
UITextPosition *position = [self positionFromPosition:selectedRange.start offset:0];
if (!position) {
if (self.text.length > self.maxLength) {
self.text = [self.text substringToIndex:self.maxLength];
self.isNameTextFieldEnbable = NO;
!self.textLengthDidMaxHandlerBlock?:self.textLengthDidMaxHandlerBlock(self);
}
}
}
//非汉字状态
else{
if (self.text.length > self.maxLength) {
self.text = [self.text substringToIndex:self.maxLength];
self.isNameTextFieldEnbable = NO;
!self.textLengthDidMaxHandlerBlock?:self.textLengthDidMaxHandlerBlock(self);
}
}
// 重绘(重新调用)
[self setNeedsDisplay];
}
#pragma mark - private
-(void)initilize{
if (@available(iOS 11.0, *)) {
self.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChange:) name:UITextViewTextDidChangeNotification object:self];
self.returnKeyType = UIReturnKeySend;
self.placePoint = CGPointMake(5, 0);
[self addObserver:self forKeyPath:@"text" options:NSKeyValueObservingOptionNew context:nil];
UIToolbar *toolBar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, 40)];
toolBar.barStyle = UIBarStyleDefault;
UIBarButtonItem *flexibleSpaceItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
UIBarButtonItem *doneItem = [[UIBarButtonItem alloc] initWithTitle:TFLocalizedString(@"完成") style:UIBarButtonItemStyleDone target:self action:@selector(hideKeyboard)];
[toolBar setItems:@[flexibleSpaceItem, doneItem]];
self.inputAccessoryView = toolBar;
}
- (void)hideKeyboard
{
[TFKeyboardManager hideKeyboard];
}
#pragma mark -KVO
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
if (object == self && [keyPath isEqualToString:@"text"]) {
!self.textDidChangeHandlerBlock?:self.textDidChangeHandlerBlock(self);
}
}
#pragma mark - getter & setter
- (void)setPlaceholder:(NSString *)placeholder {
_placeholder = [placeholder copy];
[self setNeedsDisplay];
}
- (void)setPlaceholderColor:(UIColor *)placeholderColor {
_placeholderColor = placeholderColor;
[self setNeedsDisplay];
}
- (void)setText:(NSString *)text {
[super setText:text];
//为了让kvo 监听的textviewb内容变化 能撑起contentSize,默认只是对self.text赋值self.scrollEnabled = NO;
self.scrollEnabled = YES;
//如果输入的文字超出最大行数,清零的时候需要将contentSizeOffset置空,可以让绘制的placeholde位置能正确显示
if (text.length == 0) {
[self setContentOffset:CGPointZero];
}
[self setNeedsDisplay];
}
- (void)setFont:(UIFont *)font {
[super setFont:font];
[self setNeedsDisplay];
}
-(void)setPlacePoint:(CGPoint)placePoint{
_placePoint = placePoint;
[self setNeedsDisplay];
}
@end