这么久了终于写下了自己的第一篇博客。
这个寒假留校在学院实验室学习,算是正式踏入ios开发这一块感觉对新人不太友好的领域。师傅领进门,修行在个人。所谓的自学就是不停不断的百度,所以决定开通博客,整理自己在学习过程遇到的问题以及解决方法,能够正确的节省下时间,分享自己的心得体会,也能记录自己在这一条路上的点滴吧。 煽情一波,愿十年回首,初心仍在。
组长分配的任务是写一个发布信息的界面,初以为是一个很简单的界面,后来着实发现了不少的问题。
第一个问题便是UITextView和UITextFiled的区别上。众所周知,UITextView和UITextFiled都是ios开发中最常用的用于展示和接受文本的控件,两者都可以调用系统键盘输入文本以及监听文本的改变,初学者很容易混淆这两种控件。实际上,这两个控件还是有着较大的区别。首先,UITextFiled继承与UIView[UIControl],而UITextView继承自UIScrollView,带来的差别便是UITextFiled只能单行输入单行展示,而UITextView支持多行输入多行展示,并且能够像UIScrollView一样通过滑动来浏览全文,光从这一点上,UITextView是要明显优于UITextFiled的。
但是,UITextFiled拥有的placeholder也就是能够提示用户输入相关信息的占位提示字符的属性,也是UITextView比不得的。不得不说,苹果没有提供这样一个属性给UITextView,稍有点不人性化。在实际开发中,我们常常遇到需要提示占位字符,又需要可以滚动提供多行展示的控件,单纯的UITextView和UITextFiled都不能满足这种需求。在这里总结一种方法,自定义带Placeholder属性的UITextView。
方法思路
@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的子控件,然后同样的设置文本改变的代理方法完成效果。第一篇文章就写到这里。