New file |
| | |
| | | /************************************************************ |
| | | * * Hyphenate CONFIDENTIAL |
| | | * __________________ |
| | | * Copyright (C) 2016 Hyphenate Inc. All rights reserved. |
| | | * |
| | | * NOTICE: All information contained herein is, and remains |
| | | * the property of Hyphenate Inc. |
| | | * Dissemination of this information or reproduction of this material |
| | | * is strictly forbidden unless prior written permission is obtained |
| | | * from Hyphenate Inc. |
| | | */ |
| | | |
| | | #import "EaseTextView.h" |
| | | |
| | | @implementation EaseTextView |
| | | |
| | | #pragma mark - Setters |
| | | |
| | | - (void)setPlaceHolder:(NSString *)placeHolder { |
| | | if([placeHolder isEqualToString:_placeHolder]) { |
| | | return; |
| | | } |
| | | |
| | | NSUInteger maxChars = [EaseTextView maxCharactersPerLine]; |
| | | if([placeHolder length] > maxChars) { |
| | | placeHolder = [placeHolder substringToIndex:maxChars - 8]; |
| | | placeHolder = [[placeHolder stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] stringByAppendingFormat:@"..."]; |
| | | } |
| | | |
| | | _placeHolder = placeHolder; |
| | | [self setNeedsDisplay]; |
| | | } |
| | | |
| | | - (void)setPlaceHolderTextColor:(UIColor *)placeHolderTextColor { |
| | | if([placeHolderTextColor isEqual:_placeHolderTextColor]) { |
| | | return; |
| | | } |
| | | |
| | | _placeHolderTextColor = placeHolderTextColor; |
| | | [self setNeedsDisplay]; |
| | | } |
| | | |
| | | #pragma mark - Message text view |
| | | |
| | | - (NSUInteger)numberOfLinesOfText |
| | | { |
| | | return [EaseTextView numberOfLinesForMessage:self.text]; |
| | | } |
| | | |
| | | + (NSUInteger)maxCharactersPerLine { |
| | | return ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone) ? 33 : 109; |
| | | } |
| | | |
| | | + (NSUInteger)numberOfLinesForMessage:(NSString *)text { |
| | | return (text.length / [EaseTextView maxCharactersPerLine]) + 1; |
| | | } |
| | | |
| | | #pragma mark - Text view overrides |
| | | |
| | | - (void)setText:(NSString *)text { |
| | | [super setText:text]; |
| | | [self setNeedsDisplay]; |
| | | } |
| | | |
| | | - (void)setAttributedText:(NSAttributedString *)attributedText { |
| | | [super setAttributedText:attributedText]; |
| | | [self setNeedsDisplay]; |
| | | } |
| | | |
| | | //- (void)setContentInset:(UIEdgeInsets)contentInset { |
| | | // [super setContentInset:contentInset]; |
| | | // [self setNeedsDisplay]; |
| | | //} |
| | | |
| | | - (void)setFont:(UIFont *)font { |
| | | [super setFont:font]; |
| | | [self setNeedsDisplay]; |
| | | } |
| | | |
| | | - (void)setTextAlignment:(NSTextAlignment)textAlignment { |
| | | [super setTextAlignment:textAlignment]; |
| | | [self setNeedsDisplay]; |
| | | } |
| | | |
| | | #pragma mark - Notifications |
| | | |
| | | - (void)didReceiveTextDidChangeNotification:(NSNotification *)notification { |
| | | [self setNeedsDisplay]; |
| | | } |
| | | |
| | | #pragma mark - Life cycle |
| | | |
| | | - (void)setup { |
| | | self.accessibilityIdentifier = @"text_view"; |
| | | |
| | | [[NSNotificationCenter defaultCenter] addObserver:self |
| | | selector:@selector(didReceiveTextDidChangeNotification:) |
| | | name:UITextViewTextDidChangeNotification |
| | | object:self]; |
| | | |
| | | _placeHolderTextColor = [UIColor lightGrayColor]; |
| | | |
| | | self.autoresizingMask = UIViewAutoresizingFlexibleWidth; |
| | | self.scrollIndicatorInsets = UIEdgeInsetsMake(10.0f, 0.0f, 10.0f, 8.0f); |
| | | self.contentInset = UIEdgeInsetsZero; |
| | | self.scrollEnabled = YES; |
| | | self.scrollsToTop = NO; |
| | | self.userInteractionEnabled = YES; |
| | | self.font = [UIFont systemFontOfSize:16.0f]; |
| | | self.textColor = [UIColor blackColor]; |
| | | self.backgroundColor = [UIColor whiteColor]; |
| | | self.keyboardAppearance = UIKeyboardAppearanceDefault; |
| | | self.keyboardType = UIKeyboardTypeDefault; |
| | | self.returnKeyType = UIReturnKeyDefault; |
| | | self.textAlignment = NSTextAlignmentLeft; |
| | | } |
| | | |
| | | - (id)initWithFrame:(CGRect)frame |
| | | { |
| | | self = [super initWithFrame:frame]; |
| | | if (self) { |
| | | // Initialization code |
| | | [self setup]; |
| | | } |
| | | return self; |
| | | } |
| | | |
| | | - (void)dealloc { |
| | | _placeHolder = nil; |
| | | _placeHolderTextColor = nil; |
| | | [[NSNotificationCenter defaultCenter] removeObserver:self name:UITextViewTextDidChangeNotification object:self]; |
| | | } |
| | | |
| | | #pragma mark - Drawing |
| | | |
| | | - (void)drawRect:(CGRect)rect |
| | | { |
| | | [super drawRect:rect]; |
| | | |
| | | if([self.text length] == 0 && self.placeHolder) { |
| | | CGRect placeHolderRect = CGRectMake(10.0f, |
| | | 7.0f, |
| | | rect.size.width, |
| | | rect.size.height); |
| | | |
| | | [self.placeHolderTextColor set]; |
| | | |
| | | if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_0) { |
| | | NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; |
| | | paragraphStyle.lineBreakMode = NSLineBreakByTruncatingTail; |
| | | paragraphStyle.alignment = self.textAlignment; |
| | | |
| | | [self.placeHolder drawInRect:placeHolderRect |
| | | withAttributes:@{ NSFontAttributeName : self.font, |
| | | NSForegroundColorAttributeName : self.placeHolderTextColor, |
| | | NSParagraphStyleAttributeName : paragraphStyle }]; |
| | | } |
| | | else { |
| | | [self.placeHolder drawInRect:placeHolderRect |
| | | withFont:self.font |
| | | lineBreakMode:NSLineBreakByTruncatingTail |
| | | alignment:self.textAlignment]; |
| | | } |
| | | } |
| | | } |
| | | |
| | | @end |