陈斌彬的技术博客

Stay foolish,stay hungry

iOS 中 UITextView 遇到的问题总结

前言

由于iOS中的UITextField不支持文本换行,所以在有换行需求时,我们只好用UITextView。

以下是在使用UITextView时很容易遇到的一些问题。

问题一:UITextView显示边框

UITextView默认是没有边框颜色的,没有直接的属性来设置边框颜色。

可以使用layer属性来解决,代码如下:

//设置边框宽度  
self.textView.layer.borderWidth = 1.0;  
//设置边框颜色  
self.textView.layer.borderColor = [UIColor grayColor].CGColor;  
//设置圆角  
self.textView.layer.cornerRadius = 5.0;  

问题二:UITextView居中了,怎么居上?

img

实际上,UITextView的文本默认就是居上显示的,出现上面的情况很多都是因为在iOS7下使用了navigationController让scrollView自动适应屏幕造成的。(UITextView继承自UIScrollView)。

所以解决方案如以下代码:

if ([self respondsToSelector:@selector(setAutomaticallyAdjustsScrollViewInsets:)]) {  
    self.automaticallyAdjustsScrollViewInsets = NO;  
}  

问题三:UITextView添加placeholder灰色提示文字

UITextView没有UITextField的placeholder属性来提示输入框信息,也没有其他属性或接口来设置。

有人在UITextView上覆盖个UILabel来显示placeholder信息,也是一种解决思路。

但是从写程序的角度来说,用继承UITextView来解决问题似乎更加合理些。

新建UIPlaceholderTextView类继承自UITextView。

代码如下:

UIPlaceholderTextView.h文件

@interface UIPlaceholderTextView : UITextView  

@property(nonatomic, strong) NSString *placeholder;  //灰色提示文字  

@end  

UIPlaceholderTextView.m文件

#import "UIPlaceholderTextView.h"  

@implementation UIPlaceholderTextView  

- (id)initWithFrame:(CGRect)frame {  
    if ((self = [super initWithFrame:frame])) {  
        [self awakeFromNib];  
    }  
    return self;  
}  


- (void)awakeFromNib {  
    [self addObserver];  
}  

#pragma mark 注册通知  
- (void)addObserver {  
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidBeginEditing:) name:UITextViewTextDidBeginEditingNotification object:self];  
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidEndEditing:) name:UITextViewTextDidEndEditingNotification object:self];  
}  

#pragma mark 移除通知  
- (void)dealloc {  
    [[NSNotificationCenter defaultCenter] removeObserver:self];  
}  

#pragma mark 开始编辑  
- (void)textDidBeginEditing:(NSNotification *)notification {  
    if ([super.text isEqualToString:_placeholder]) {  
        super.text = @"";  
        [super setTextColor:[UIColor blackColor]];  
    }  
}  

#pragma mark 结束编辑  
- (void)textDidEndEditing:(NSNotification *)notification {  
    if (super.text.length == 0) {  
        super.text = _placeholder;  
         //如果文本框内是原本的提示文字,则显示灰色字体  
        [super setTextColor:[UIColor lightGrayColor]];  
    }  
}  

#pragma mark 重写setPlaceholder方法  
- (void)setPlaceholder:(NSString *)aPlaceholder {  
    _placeholder = aPlaceholder;  
    [self textDidEndEditing:nil];  
}  

#pragma mark 重写getText方法  
- (NSString *)text {  
    NSString *text = [super text];  
    if ([text isEqualToString:_placeholder]) {  
        return @"";  
    }  
    return text;  
}  


@end  

在使用UIPlaceholderTextView的控制器的viewDidLoad方法里添加如下代码

self.placeHolderTextView.placeholder=@"这一刻你想说什么......";  

img