UITextView和UITextFiled的区别以及自定义带Placeholder属性的UITextView

这么久了终于写下了自己的第一篇博客。

这个寒假留校在学院实验室学习,算是正式踏入ios开发这一块感觉对新人不太友好的领域。师傅领进门,修行在个人。所谓的自学就是不停不断的百度,所以决定开通博客,整理自己在学习过程遇到的问题以及解决方法,能够正确的节省下时间,分享自己的心得体会,也能记录自己在这一条路上的点滴吧。 煽情一波,愿十年回首,初心仍在。

组长分配的任务是写一个发布信息的界面,初以为是一个很简单的界面,后来着实发现了不少的问题。

第一个问题便是UITextView和UITextFiled的区别上。众所周知,UITextView和UITextFiled都是ios开发中最常用的用于展示和接受文本的控件,两者都可以调用系统键盘输入文本以及监听文本的改变,初学者很容易混淆这两种控件。实际上,这两个控件还是有着较大的区别。首先,UITextFiled继承与UIView[UIControl],而UITextView继承自UIScrollView,带来的差别便是UITextFiled只能单行输入单行展示,而UITextView支持多行输入多行展示,并且能够像UIScrollView一样通过滑动来浏览全文,光从这一点上,UITextView是要明显优于UITextFiled的。

但是,UITextFiled拥有的placeholder也就是能够提示用户输入相关信息的占位提示字符的属性,也是UITextView比不得的。不得不说,苹果没有提供这样一个属性给UITextView,稍有点不人性化。在实际开发中,我们常常遇到需要提示占位字符,又需要可以滚动提供多行展示的控件,单纯的UITextView和UITextFiled都不能满足这种需求。在这里总结一种方法,自定义带Placeholder属性的UITextView。

方法思路

1.创建继承自UITextView的MyTextView。
2.给MyTextView添加一个UILabel属性的变量,作为placeholder。
3.在.m文件中重写drawRect和相关属性的set方法
4.设置UITextView的文本改变的代理方法。
代码如下
.h文件
@interface MyTxetView : UITextView
@property(nonatomic) UILabel *placeHolderLabel;
@property(nonatomic) NSString *placeholder;
@property(nonatomic) UIColor *placeholderColor;
.m文件
#import "MyTxetView.h"

@implementation MyTxetView

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

- (void)setUpSubViews
{
    self.text  = @"";
    [self setPlaceholder:@""];
    [self setPlaceholderColor:[UIColor lightGrayColor]];
}

- (void)setText:(NSString *)text {
    [super setText:text];
}
- (void)drawRect:(CGRect)rect
{
    [super drawRect:rect];
    if( [[self placeholder] length] > 0 )
    {
        if ( _placeHolderLabel == nil )
        {
            _placeHolderLabel = [[UILabel alloc] initWithFrame:CGRectMake(8,8,self.bounds.size.width - 16,0)];
            _placeHolderLabel.numberOfLines = 0;
            _placeHolderLabel.font = self.font;
            _placeHolderLabel.backgroundColor = [UIColor clearColor];
            _placeHolderLabel.textColor = self.placeholderColor;
            _placeHolderLabel.alpha = 0;
            _placeHolderLabel.tag = 666;
            [self addSubview:_placeHolderLabel];
        }
        _placeHolderLabel.text = self.placeholder;
        [_placeHolderLabel sizeToFit];
        [self sendSubviewToBack:_placeHolderLabel];
    }
    if( [[self text] length] == 0 && [[self placeholder] length] > 0 )
    {
        [[self viewWithTag:666] setAlpha:1];
    }
}
文本改变的代理方法


-(void)textViewDidChange:(MyTxetView *)textView
{
   
    
    if([textView.placeholder length]==0)
    {
        [textView.placeHolderLabel setAlpha:1];
    }
    else
    {
        [textView.placeHolderLabel setAlpha:0];
    }
    if([textView.text isEqualToString:@""])
    {
        [textView.placeHolderLabel setAlpha:1];
    }
}



网上实现placeholder的方法很多,也有很多简单的方法,但这种方法实现出的placeholder几乎 与UITextView的相同,都是实现动态监听文本的改变,并非弹出键盘时就立即清除placeholder,只有当用户开始输入文本的时候,placeholder才会消失。同样,当用户清空文本的时候,placeholder又会重新显示出来。并且这种方法可移植性和拓展性都很好,可按照我们喜好随意设置placeholder。当然,如果并不需要这些的话,其实可以直接在项目中为UITextView添加一个UILabel的子控件,然后同样的设置文本改变的代理方法完成效果。第一篇文章就写到这里。







猜你喜欢

转载自blog.csdn.net/qq_36793206/article/details/79117501