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.
 
 
 

159 lines
5.0 KiB

//
// XHMessageTextView.m
// MessageDisplayExample
//
// Created by HUAJIE-1 on 14-4-24.
// Copyright (c) 2014年 嗨,我是曾宪华(@xhzengAIB),曾加入YY Inc.担任高级移动开发工程师,拍立秀App联合创始人,热衷于简洁、而富有理性的事物 QQ:543413507 主页:http://zengxianhua.com All rights reserved.
//
#import "XHMessageTextView.h"
@implementation XHMessageTextView
#pragma mark - Setters
- (void)setPlaceHolder:(NSString *)placeHolder {
if([placeHolder isEqualToString:_placeHolder]) {
return;
}
NSUInteger maxChars = [XHMessageTextView 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 [XHMessageTextView numberOfLinesForMessage:self.text];
}
+ (NSUInteger)maxCharactersPerLine {
return ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone) ? 33 : 109;
}
+ (NSUInteger)numberOfLinesForMessage:(NSString *)text {
return (text.length / [XHMessageTextView 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 {
[[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 ([[[UIDevice currentDevice]systemVersion]floatValue] >= 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