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