all

UITextView 中的占位符

发布于 2022-03-22 23:18:50

我的应用程序使用UITextView. 现在我希望UITextView有一个类似于您可以为UITextField.

这个怎么做?

关注者
0
被浏览
19
1 个回答
  • 面试哥
    面试哥 2022-03-22
    为面试而生,有面试问题,就找面试哥。

    我对 bcd 的解决方案做了一些小的修改,以允许从Xib文件初始化、文本换行和保持背景颜色。希望它会为其他人省去麻烦。

    UIPlaceHolderTextView.h:

    #import <Foundation/Foundation.h>
    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
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看