三種方式實現(xiàn)帶有占位符的textView

項目要求, 話不多說, 下面直接開始.


第一種: 在自定義 textView 中添加一個 UILabel

這種可行是可行, 但是沒怎么見過人往 imageView 啊, textView 啊, 這種控件上面添加控件的, 感覺很怪~
思路就是添加 label 之后在輸入文本的時候隱藏 label, 沒有文本的時候顯示 label即可.


第二種: 利用消息傳遞, 關(guān)聯(lián)對象等底層實現(xiàn)占位符

這種比較麻煩, 弱雞如我并看得不順暢, 下面甩個鏈接.
點這里


第三種: 用 drawRect 方法直接畫一個 placeholder

這種方法我覺得可行度最高, 沒啥難度, 代碼最不麻煩.

首先我們新建一個自定義文件繼承自UITextView, 然后我們考慮需要修改什么屬性, 首先這個自定義控件本身就繼承自系統(tǒng)控件, 那么font, textColor這些屬性可以直接外部修改就行了, 只需要自己設(shè)置占位文字和它的相關(guān)屬性即可(顏色, 字體等等), 如果想修改光標(biāo)顏色, 那么可能得用到runtime去用kvc修改系統(tǒng)屬性, 具體方法請參考這里, 可以試一下, 不知道可行不.

那么來到.h文件:

#import <UIKit/UIKit.h>

@interface ZYNPlaceholderTextView : UITextView

/** 占位符 */
@property (nonatomic, copy) NSString *zyn_placeholder;

/** 占位文字顏色 */
@property (nonatomic, strong) UIColor *placeholderColor;

@end

.h沒什么好說的

接下來, 來到.m文件:
這里得知道監(jiān)聽文字改變事件, 系統(tǒng)textView自帶UITextViewTextDidChangeNotification方法去監(jiān)聽.

首先重寫初始化方法:

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UITextViewTextDidChangeNotification object:nil];
}

- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        [self initPrivate];
    }
    return self;
}


- (void)initPrivate {
    
    // 監(jiān)聽文字改變
    [[NSNotificationCenter defaultCenter] addObserver:self
                      selector:@selector(textDidChange)
                          name:UITextViewTextDidChangeNotification
                        object:nil];
}

/**
 監(jiān)聽文字改變, 立馬顯示
 */
- (void)textDidChange {
    [self setNeedsDisplay];
}

初始化方法就是監(jiān)聽一下文字改變了沒, 記得用完通知要在dealloc里面釋放通知. 監(jiān)聽完文字改變, 我們就可以畫占位符了.

打開系統(tǒng)自己注釋掉的drawRect方法:

- (void)drawRect:(CGRect)rect {
    // Drawing code
    
    // 如果有文字就不繪制占位文字
    if ([self hasText]) {
        return;
    }
    
    // 設(shè)置字體屬性
    NSMutableDictionary *attrs = [NSMutableDictionary dictionaryWithCapacity:0];
    attrs[NSFontAttributeName] = self.font;
    attrs[NSForegroundColorAttributeName] = self.placeholderColor;
    
    // 設(shè)置占位符大小區(qū)域
    rect.origin.x = 5;
    rect.origin.y = 7;
    rect.size.width -= 2 * rect.origin.x;
    rect.size.height -= 2 * rect.origin.y;
    
    [self.zyn_placeholder drawInRect:rect
                      withAttributes:attrs];
}

至此, 大功告成, 可以使用了.

下面是使用方法:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    ZYNPlaceholderTextView *textView = [[ZYNPlaceholderTextView alloc] initWithFrame:CGRectMake(10, 30, [UIScreen mainScreen].bounds.size.width - 20, [UIScreen mainScreen].bounds.size.height - 60)];
    textView.backgroundColor = [UIColor grayColor];
    textView.zyn_placeholder = @"這是一個占位符";
    textView.font = [UIFont systemFontOfSize:22];
    textView.textColor = [UIColor redColor];
    textView.placeholderColor = [UIColor blueColor];
    [self.view addSubview:textView];
}

最后上兩張效果圖:

輸入前
輸入后
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钠绍,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子花沉,更是在濱河造成了極大的恐慌柳爽,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碱屁,死亡現(xiàn)場離奇詭異磷脯,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)娩脾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進(jìn)店門赵誓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事俩功“澹” “怎么了?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵绑雄,是天一觀的道長。 經(jīng)常有香客問我奥邮,道長万牺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任洽腺,我火速辦了婚禮脚粟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蘸朋。我一直安慰自己核无,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布藕坯。 她就那樣靜靜地躺著团南,像睡著了一般。 火紅的嫁衣襯著肌膚如雪炼彪。 梳的紋絲不亂的頭發(fā)上吐根,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天,我揣著相機(jī)與錄音辐马,去河邊找鬼拷橘。 笑死,一個胖子當(dāng)著我的面吹牛喜爷,可吹牛的內(nèi)容都是我干的冗疮。 我是一名探鬼主播,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼檩帐,長吁一口氣:“原來是場噩夢啊……” “哼术幔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起轿塔,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤特愿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后勾缭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體揍障,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年俩由,在試婚紗的時候發(fā)現(xiàn)自己被綠了毒嫡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖兜畸,靈堂內(nèi)的尸體忽然破棺而出努释,到底是詐尸還是另有隱情,我是刑警寧澤咬摇,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布伐蒂,位于F島的核電站,受9級特大地震影響肛鹏,放射性物質(zhì)發(fā)生泄漏歌亲。R本人自食惡果不足惜衷旅,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一祈搜、第九天 我趴在偏房一處隱蔽的房頂上張望庭再。 院中可真熱鬧,春花似錦芒珠、人聲如沸桥狡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽裹芝。三九已至,卻和暖如春好爬,著一層夾襖步出監(jiān)牢的瞬間局雄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工存炮, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留炬搭,地道東北人。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓穆桂,卻偏偏與公主長得像宫盔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子享完,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,781評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 占位文字1灼芭、曾經(jīng)有個這么一個項目需求: 使用textField時,占位文字默認(rèn)是黑色的,我們的需求是當(dāng)開始編輯時,...
    博行天下閱讀 915評論 2 1
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件般又、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,124評論 4 61
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,319評論 25 707
  • 他從小被別人排擠彼绷。 他和其他小孩子一樣,都是那樣天真茴迁,無邪寄悯,可愛。只是他會讓別人感覺到可怕堕义,不管是誰和他玩...
    很符合我閱讀 408評論 0 1
  • 愛猜旬,其實是短暫的永恒,人生,其實也是短暫的永恒洒擦。 只要彼此在一起真愛過椿争,一個夏天和一輩子又有何分別呢。 有的人的在...
    海德文閱讀 563評論 2 2