zoukankan      html  css  js  c++  java
  • 在UITextView中添加placeholder

    #import <UIKit/UIKit.h>
    
    @interface UIPlaceHolderTextView : UITextView {
        NSString *placeholder;
        UIColor *placeholderColor;
        
    @private
        UILabel *placeHolderLabel;
    }
    @property (nonatomic, retain) UILabel *placeHolderLabel;
    @property (nonatomic, copy) NSString *placeholder;
    @property (nonatomic, retain) UIColor *placeholderColor;
    -(void)textChanged:(NSNotification*)notification;
    @end
    #import "UIPlaceHolderTextView.h"
    
    @implementation UIPlaceHolderTextView
    @synthesize placeHolderLabel;
    @synthesize placeholder;
    @synthesize placeholderColor;
    
    - (void)dealloc
    {
        [[NSNotificationCenter defaultCenter] removeObserver:self];
        [placeHolderLabel release]; self.placeHolderLabel = nil;
        [placeholderColor release]; self.placeholderColor = nil;
         self.placeholder = nil;
        [super dealloc];
    }
    
    - (void)awakeFromNib
    {
        [super awakeFromNib];
        [self setPlaceholder:@""];
        [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;
        }
        
        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 - 16,0)];
                placeHolderLabel.lineBreakMode = UILineBreakModeWordWrap;
                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

    from:http://stackoverflow.com/questions/1328638/placeholder-in-uitextview

    备注:以上方法placeHolderLabel子视图会内存泄漏,下面的SSToolkit中的SSTextView方法会更好些!

    //
    //  SSTextView.h
    //  SSToolkit
    //
    //  Created by Sam Soffes on 8/18/10.
    //  Copyright 2010-2011 Sam Soffes. All rights reserved.
    //
    
    /**
     UITextView subclass that adds placeholder support like UITextField has.
     */
    @interface SSTextView : UITextView
    
    /**
     The string that is displayed when there is no other text in the text view.
     
     The default value is `nil`.
     */
    @property (nonatomic, strong) NSString *placeholder;
    
    /**
     The color of the placeholder.
     
     The default is `[UIColor lightGrayColor]`.
     */
    @property (nonatomic, strong) UIColor *placeholderTextColor;
    
    @end
    //
    //  SSTextView.m
    //  SSToolkit
    //
    //  Created by Sam Soffes on 8/18/10.
    //  Copyright 2010-2011 Sam Soffes. All rights reserved.
    //
    
    #import "SSTextView.h"
    
    @interface SSTextView ()
    - (void)_initialize;
    - (void)_updateShouldDrawPlaceholder;
    - (void)_textChanged:(NSNotification *)notification;
    @end
    
    
    @implementation SSTextView {
        BOOL _shouldDrawPlaceholder;
    }
    
    
    #pragma mark - Accessors
    
    @synthesize placeholder = _placeholder;
    @synthesize placeholderTextColor = _placeholderTextColor;
    
    - (void)setText:(NSString *)string {
        [super setText:string];
        [self _updateShouldDrawPlaceholder];
    }
    
    
    - (void)setPlaceholder:(NSString *)string {
        if ([string isEqual:_placeholder]) {
            return;
        }
        
        _placeholder = string;
        [self _updateShouldDrawPlaceholder];
    }
    
    
    #pragma mark - NSObject
    
    - (void)dealloc {
        [[NSNotificationCenter defaultCenter] removeObserver:self name:UITextViewTextDidChangeNotification object:self];
    }
    
    
    #pragma mark - UIView
    
    - (id)initWithCoder:(NSCoder *)aDecoder {
        if ((self = [super initWithCoder:aDecoder])) {
            [self _initialize];
        }
        return self;
    }
    
    
    - (id)initWithFrame:(CGRect)frame {
        if ((self = [super initWithFrame:frame])) {
            [self _initialize];
        }
        return self;
    }
    
    
    - (void)drawRect:(CGRect)rect {
        [super drawRect:rect];
        
        if (_shouldDrawPlaceholder) {
            [_placeholderTextColor set];
            [_placeholder drawInRect:CGRectMake(8.0f, 8.0f, self.frame.size.width - 16.0f, self.frame.size.height - 16.0f) withFont:self.font];
        }
    }
    
    
    #pragma mark - Private
    
    - (void)_initialize {
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_textChanged:) name:UITextViewTextDidChangeNotification object:self];
        
        self.placeholderTextColor = [UIColor colorWithWhite:0.702f alpha:1.0f];
        _shouldDrawPlaceholder = NO;
    }
    
    
    - (void)_updateShouldDrawPlaceholder {
        BOOL prev = _shouldDrawPlaceholder;
        _shouldDrawPlaceholder = self.placeholder && self.placeholderTextColor && self.text.length == 0;
        
        if (prev != _shouldDrawPlaceholder) {
            [self setNeedsDisplay];
        }
    }
    
    
    - (void)_textChanged:(NSNotification *)notificaiton {
        [self _updateShouldDrawPlaceholder];    
    }
    
    @end
  • 相关阅读:
    iOS开发>学无止境
    iOS开发>学无止境
    Review1(C#语言基础)
    Lua
    c#笔记(四)——switch
    鼠标拖拽物体
    lua-路径加载lua文件-函数返回值,访问lua文件中的变量
    lua-1-c# 执行lua文件-调用lua文件中的方法
    Unity实现手机录音功能
    lua-table类的继承
  • 原文地址:https://www.cnblogs.com/appwgh/p/2573443.html
Copyright © 2011-2022 走看看