当前位置: 代码迷 >> 综合 >> UITextView和UITextFiled的区别以及自定义带Placeholder属性的UITextView
  详细解决方案

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

热度:76   发布时间:2023-10-29 00:04:37.0

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

这个寒假留校在学院实验室学习,算是正式踏入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的子控件,然后同样的设置文本改变的代理方法完成效果。第一篇文章就写到这里。







  相关解决方案