zoukankan      html  css  js  c++  java
  • iOS 设置带占位文字的TextView

    原生TextView无占位文字, 可通过drawRect:方法为其添加占位文字, 具体设置如下:

    1. 获取当前占位文字属性:

    // 文字属性
    NSMutableDictionary *attrs = [NSMutableDictionary dictionary];
    attrs[NSFontAttributeName] = self.font; // 获取当前PlaceholderTextView的文字属性
    attrs[NSForegroundColorAttributeName] = self.placeholderColor ? self.placeholderColor : [UIColor lightGrayColor];

    2. 设置绘制范围(包含文字边距):

    // 绘制范围
    CGFloat placeholderTopMargin = self.placeholderTopMargin ? self.placeholderTopMargin : kPlaceholderDefaultTopMargin;
    CGFloat placeholderLeftMargin = self.placeholderLeftMargin ? self.placeholderLeftMargin : kPlaceholderDefaultTopMargin;
        
    CGFloat placeholderX = placeholderTopMargin;
    CGFloat placeholderY = placeholderLeftMargin;
    CGFloat placeholderW = rect.size.width - 2 * placeholderLeftMargin;
    CGFloat placeholderH = rect.size.height - 2 * placeholderTopMargin;
    CGRect placeholderRect = CGRectMake(placeholderX, placeholderY, placeholderW, placeholderH);
        
    [self.placeholder drawInRect:placeholderRect withAttributes:attrs];

    3. 通过通知或代理, 当TextView文字发生改变时, 重新绘制:

    // 设置通知, 当TextView文字发生改变时, 向自己发送通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChanged) name:UITextViewTextDidChangeNotification object:self];

    通知事件:

    - (void)textDidChanged
    {
        // 重新绘制
        [self setNeedsDisplay];
    }

    4. 重写TextView属性方法, 实时绘制:

    - (void)setPlaceholder:(NSString *)placeholder
    {
        _placeholder = [placeholder copy];
        
        // 会在下一个消息循环调用drawRect
        [self setNeedsDisplay];
    }
    - (void)setPlaceholderColor:(UIColor *)placeholderColor
    {
        _placeholderColor = placeholderColor;
        
        [self setNeedsDisplay];
    }
    - (void)setText:(NSString *)text
    {
        [super setText:text]; // 系统自带属性
        
        [self setNeedsDisplay];
    }
    - (void)setAttributedText:(NSAttributedString *)attributedText
    {
        [super setAttributedText:attributedText];
        
        [self setNeedsDisplay];
    }
    - (void)setFont:(UIFont *)font
    {
        [super setFont:font];
        
        [self setNeedsDisplay];
    }

    GitHubs:https://github.com/BigPlane/CHPlaceholderTextView

  • 相关阅读:
    [redis读书笔记] 第二部分 sentinel
    [redis读书笔记] 第三部分 多机数据库的实现 复制
    单线程的REDIS为什么这么快?
    [redis读书笔记] 第二部分 单机数据库 RDB持久化
    [redis读书笔记] 第二部分 单机数据库 数据库实现
    选靓号——拼多多笔试题(贪心+暴力)
    种树——拼多多笔试题(暴搜+剪枝)
    【学习笔记】《Java编程思想》 第8~11章
    leetcode——二分
    CodeForces-1265E(期望)
  • 原文地址:https://www.cnblogs.com/happyplane/p/4775345.html
Copyright © 2011-2022 走看看