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.
160 lines
0 B
160 lines
0 B
![]()
2 years ago
|
//
|
||
|
// 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
|