Placeholder in UITextView

前端 未结 30 2814
野趣味
野趣味 2020-11-22 16:01

My application uses an UITextView. Now I want the UITextView to have a placeholder similar to the one you can set for an UITextField.<

30条回答
  •  囚心锁ツ
    2020-11-22 16:04

    I made a few minor modifications to bcd's solution to allow for initialization from a Xib file, text wrapping, and to maintain background color. Hopefully it will save others the trouble.

    UIPlaceHolderTextView.h:

    #import 
    IB_DESIGNABLE
    @interface UIPlaceHolderTextView : UITextView
    
    @property (nonatomic, retain) IBInspectable NSString *placeholder;
    @property (nonatomic, retain) IBInspectable UIColor *placeholderColor;
    
    -(void)textChanged:(NSNotification*)notification;
    
    @end
    

    UIPlaceHolderTextView.m:

    #import "UIPlaceHolderTextView.h"
    
    @interface UIPlaceHolderTextView ()
    
    @property (nonatomic, retain) UILabel *placeHolderLabel;
    
    @end
    
    @implementation UIPlaceHolderTextView
    
    CGFloat const UI_PLACEHOLDER_TEXT_CHANGED_ANIMATION_DURATION = 0.25;
    
    - (void)dealloc
    {
        [[NSNotificationCenter defaultCenter] removeObserver:self];
    #if __has_feature(objc_arc)
    #else
        [_placeHolderLabel release]; _placeHolderLabel = nil;
        [_placeholderColor release]; _placeholderColor = nil;
        [_placeholder release]; _placeholder = nil;
        [super dealloc];
    #endif
    }
    
    - (void)awakeFromNib
    {
        [super awakeFromNib];
    
        // Use Interface Builder User Defined Runtime Attributes to set
        // placeholder and placeholderColor in Interface Builder.
        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 - 16,0)];
                _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
    

提交回复
热议问题