• iOS开发-UITextView实现PlaceHolder的方式


    之前开发遇到过UITextField中加入一个PlaceHolder的问题,直接设置一下即可,不过这次是需要在UITextView中实现一个PlaceHolder,跟之前有点不同。在网上参考了各位前辈的解决方案,大概有两种方式,第一种方式很猥琐,就是直接给UITextView的text赋值,比如说默认提示是"博客园FlyElephant",在textViewDidChange中判断是不是“博客园FlyElephant”,如果是就清空,如果不是就继续提示,弊端就是用户输入的内容不能和你的默认提示一样,第二种方式需要加入一个UILabel,同样在textViewDidChange中进行判断,一般都是这么实现,不过有的都是创建textView中的时候创建UILabel,这样做无可厚非,不过最好还是抽象出来。继承UITextView扩展一下,新建一个FEPlaceHolderTextView:

    头文件:

    //
    //  FEPlaceHolderTextView.h
    //  MyTextViewDemo
    //http://www.cnblogs.com/xiaofeixiang
    //  Created by keso on 15/5/17.
    //  Copyright (c) 2015年 keso. All rights reserved.
    //
    
    #import <UIKit/UIKit.h>
    
    @interface FEPlaceHolderTextView : UITextView
    
    @property (nonatomic, retain) NSString *placeholder;
    @property (nonatomic, retain) UIColor *placeholderColor;
    
    -(void)textChanged:(NSNotification*)notification;
    
    
    @end
    

     实现文件:

    //
    //  FEPlaceHolderTextView.m
    //  MyTextViewDemo
    //http://www.cnblogs.com/xiaofeixiang
    //  Created by keso on 15/5/17.
    //  Copyright (c) 2015年 keso. All rights reserved.
    //
    
    #import "FEPlaceHolderTextView.h"
    
    @interface FEPlaceHolderTextView ()
    
    @property (nonatomic, retain) UILabel *placeHolderLabel;
    
    @end
    
    @implementation FEPlaceHolderTextView
    
    CGFloat const UI_PLACEHOLDER_TEXT_CHANGED_ANIMATION_DURATION = 0.25;
    
    - (void)dealloc
    {
        [[NSNotificationCenter defaultCenter] removeObserver:self];
    }
    
    - (void)awakeFromNib
    {
        [super awakeFromNib];
        if (!self.placeholder) {
            [self setPlaceholder:@""];
        }
        
        if (!self.placeholderColor) {
            [self setPlaceholderColor:[UIColor lightGrayColor]];
        }
        
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChanged:) name:UITextViewTextDidChangeNotification object:nil];
    }
    
    - (id)initWithFrame:(CGRect)frame
    {
        if( (self = [super initWithFrame:frame]) )
        {
            [self setPlaceholder:@""];
            [self setPlaceholderColor:[UIColor lightGrayColor]];
            [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChanged:) name:UITextViewTextDidChangeNotification object:nil];
        }
        return self;
    }
    
    - (void)textChanged:(NSNotification *)notification
    {
        if([[self placeholder] length] == 0)
        {
            return;
        }
        
        [UIView animateWithDuration:UI_PLACEHOLDER_TEXT_CHANGED_ANIMATION_DURATION animations:^{
            if([[self text] length] == 0)
            {
                [[self viewWithTag:999] setAlpha:1];
            }
            else
            {
                [[self viewWithTag:999] setAlpha:0];
            }
        }];
    }
    
    - (void)setText:(NSString *)text {
        [super setText:text];
        [self textChanged:nil];
    }
    
    - (void)drawRect:(CGRect)rect
    {
        if( [[self placeholder] length] > 0 )
        {
            if (_placeHolderLabel == nil )
            {
                _placeHolderLabel = [[UILabel alloc] initWithFrame:CGRectMake(8,8,self.bounds.size.width,10)];
                _placeHolderLabel.lineBreakMode = NSLineBreakByWordWrapping;
                _placeHolderLabel.numberOfLines =0;
                _placeHolderLabel.font = self.font;
                _placeHolderLabel.backgroundColor = [UIColor clearColor];
                _placeHolderLabel.textColor = self.placeholderColor;
                _placeHolderLabel.alpha = 0;
                _placeHolderLabel.tag = 999;
                [self addSubview:_placeHolderLabel];
            }
            
            _placeHolderLabel.text = self.placeholder;
            [_placeHolderLabel sizeToFit];
            [self sendSubviewToBack:_placeHolderLabel];
        }
        
        if( [[self text] length] == 0 && [[self placeholder] length] > 0 )
        {
            [[self viewWithTag:999] setAlpha:1];
        }
        
        [super drawRect:rect];
    }
    
    
    @end
    

     调用:

        self.textView=[[FEPlaceHolderTextView alloc]initWithFrame:CGRectMake(10, 30, CGRectGetWidth(self.view.frame)-20, 200)];
        self.textView.placeholder=@"博客园FlyElephant
    博客地址:http://www.cnblogs.com/xiaofeixiang";
        self.textView.layer.borderColor=[UIColor lightGrayColor].CGColor;
        self.textView.layer.borderWidth=1.0;
        self.textView.scrollEnabled = YES;
        self.textView.autoresizingMask =
        UIViewAutoresizingFlexibleHeight; //自适应高度
        self.textView.returnKeyType = UIReturnKeyDefault; //返回键的类型
        
        self.textView.keyboardType = UIKeyboardTypeDefault; //键盘类型
        [self.view addSubview:self.textView];
    

    效果:

  • 相关阅读:
    bootstrap之CDN
    bootstrap之HTML模板
    Glyphicon 字体图标
    crawler4j 学习(二)
    【软件构造】第二章 软件构建的过程和工具(2)
    【软件构造】第二章 软件构建的过程和工具(1)
    【软件构造】第一章 软件构造基础(2)
    【软件构造】第一章 软件构造基础(1)
    机器学习技法笔记-Lecture 1 Linear support vector machine
    机器学习基石笔记-Lecture 15 Validation
  • 原文地址:https://www.cnblogs.com/xiaofeixiang/p/4509665.html
Copyright © 2020-2023  润新知