UITextView添加占位字符

原创 2015年11月19日 10:53:12
#import "YGTextView.h"

#define kPlaceholderDefaultTopMargin 4     // Placeholder上下间距
#define kPlaceholderDefaultLeftMargin 5    // Placeholder左右间距
@implementation YGTextView

#pragma mark - 初始化PlaceholderTextView
- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    
    if (self)
    {
        self.opaque = YES;
        
        // 设置通知, 当TextView文字发生改变时, 向自己发送通知
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChanged) name:UITextViewTextDidChangeNotification object:self];
    }
    
    return self;
}

#pragma mark - 通知事件
- (void)textDidChanged
{
    // 重新绘制
    [self setNeedsDisplay];
}

#pragma mark - 重写属性方法, 实时绘制
- (void)setPlaceholder:(NSString *)placeholder
{
    _placeholder = [placeholder copy];
    
    [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];
    
    // 会在下一个消息循环调用drawRect
    [self setNeedsDisplay];
}

#pragma mark - 绘制子控件
- (void)drawRect:(CGRect)rect
{
    // 若TextView有文字
    if (self.hasText)
    {
        return;
    }
    
    // 文字属性
    NSMutableDictionary *attrs = [NSMutableDictionary dictionary];
    attrs[NSFontAttributeName] = self.font; // 获取当前PlaceholderTextView的文字属性
    attrs[NSForegroundColorAttributeName] = self.placeholderColor ? self.placeholderColor : [UIColor lightGrayColor];
    
    // 绘制范围
    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];
}

#pragma mark - 移除通知
- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

@end

版权声明:本文为博主原创文章,未经博主允许不得转载。

iOS疯狂详解之UITextView加上占位字符

// //  SSTextView.h //  SSToolkit // //  Created by Sam Soffes on 8/18/10. //  Copyright 2010-2...
  • wangLongBlog
  • wangLongBlog
  • 2014年12月10日 21:50
  • 1185

给TextView添加占位符

// // HYBTextView.h // // Created by huangyibiao on 14-6-3. // Copyright (c) 2014年 huangyibiao. A...
  • woaifen3344
  • woaifen3344
  • 2014年08月05日 10:59
  • 8408

史上最全的iOS之UITextView实现placeHolder占位文字的N种方法

前言 iOS开发中,UITextField和UITextView是最常用的文本接受类和文本展示类的控件。UITextField和UITextView都输入文本,也都可以监听文本的改变。不同的是,UI...
  • pengyuan_D
  • pengyuan_D
  • 2016年08月05日 02:59
  • 1006

iOS 怎么给UITextView添加占位符文字

起初,方法是在UITextView上加一个label,在UITextView开始编辑时在代理方法里隐藏label,结束编辑时如果UITextView没文字,再把label显示出来。相比如下方法显得麻烦...
  • txz_gray
  • txz_gray
  • 2017年01月17日 14:49
  • 576

UILabel + UITextView 字间距和行间距

UILabel:创建category .h #import @interface UILabel (JKLableChangeLineSpace) /** * 改变行间距 */ +...
  • wujakf
  • wujakf
  • 2017年05月13日 15:03
  • 640

UITextView实现占位文字

UITextField *textField默认的情况 1.只能显示一行文字 2.有占位文字UITextView *textView默认的情况 2.能显示任意行文字 2.没有占位文字文...
  • u013094208
  • u013094208
  • 2016年08月08日 22:49
  • 483

ios UITextView bug 输入文字跳动bug问题 (・ˍ・*)

ios UITextView 输入中文时文字跳动问题 当输入中文文字多于显示的textview框时,最后一行的文字有时候会因为输入的时候而跳动把最后一行的文字盖住一半,再输入时却又跳起来显示. 这是什...
  • banzhiyao
  • banzhiyao
  • 2014年10月29日 19:47
  • 3860

iOS中UITextView遇到的问题总结

前言 由于iOS中的UITextField不支持文本换行,所以在有换行需求时,我们只好用UITextView。 以下是在使用UITextView时很容易遇到的一些问题。 问题一:UIText...
  • DJH996064549
  • DJH996064549
  • 2016年02月22日 14:06
  • 604

详解C语言printf函数以及%占位符知识

功能: C语言中产生格式化输出的函数(定义在stdio.h系统头文件中),向终端输出 (显示屏等。。。); 定义: int printf(const char *format,[argument]...
  • HL_developer
  • HL_developer
  • 2015年12月09日 01:06
  • 2948

[Swift]iOS 开发:给 UITextView 添加占位符的方法

本文参考了史上最全的iOS之UITextView实现placeHolder占位文字的N种方法,从中选出了我认为最省事的一种方法,尽量最简化,代码如下:class CustomTextView: UIT...
  • qq_17036081
  • qq_17036081
  • 2017年06月11日 10:40
  • 125
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UITextView添加占位字符
举报原因:
原因补充:

(最多只允许输入30个字)