美文网首页ios开发进阶固予iOS 开发之 — 理论知识汇总
【IOS】UITextView实现placeHolder占位文字

【IOS】UITextView实现placeHolder占位文字

作者: 雨影 | 来源:发表于2017-06-27 10:14 被阅读695次

    此方法适用于IOS8之后.

    通过runtime,我们发现,UITextView内部有一个名为“_placeHolderLabel”的私有成员变量。大家知道,Objective-C没有绝对的私有变量,因为我们可以通过KVC来访问私有变量。

    特点:虽然Apple官方没有给我们开发者提供类似于placeholder的属性,但是通过运行时,我们遍历出了一个placeHolderLabel的私有变量。这种方法简单易懂,代码量少,推荐大家使用这种方法。

    #import "ViewController.h"
    #import <objc/runtime.h>
    #import <objc/message.h>
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
      // 通过运行时,发现UITextView有一个叫做“_placeHolderLabel”的私有变量
        unsigned int count = 0;
        Ivar *ivars = class_copyIvarList([UITextView class], &count);
    
        for (int i = 0; i < count; i++) {
            Ivar ivar = ivars[i];
            const char *name = ivar_getName(ivar);
            NSString *objcName = [NSString stringWithUTF8String:name];
            NSLog(@"%d : %@",i,objcName);
        }
    
    }
    
    
    @end
    

    所以我们只需以下方式就可以给textView添加placeholder

    - (void)setupTextView
    {
        UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(0, 100, [UIScreen mainScreen].bounds.size.width, 100];
        [textView setBackgroundColor:[UIColor greenColor]];
        [self.view addSubview:textView];
    
        // _placeholderLabel
        UILabel *placeHolderLabel = [[UILabel alloc] init];
        placeHolderLabel.text = @"请输入内容";
        placeHolderLabel.numberOfLines = 0;
        placeHolderLabel.textColor = [UIColor lightGrayColor];
        [placeHolderLabel sizeToFit];
        [textView addSubview:placeHolderLabel];//这句很重要不要忘了
    
        // same font
        textView.font = [UIFont systemFontOfSize:13.f];
        placeHolderLabel.font = [UIFont systemFontOfSize:13.f];
    
        [textView setValue:placeHolderLabel forKey:@"_placeholderLabel"];
    }
    

    相关文章

      网友评论

      • Boole:似乎textView.font = [UIFont systemFontOfSize:13.f]; placeHolderLabel.font = [UIFont systemFontOfSize:13.f];这两句也很重要,不然第一次出来的placeHolderLabel的frame不正确.
        雨影:@Boole 是的呢。这两句保证字体一致
      • Lol刀妹:可以,很强势
        雨影:@无夜之星辰 :smile:
      • 吾名唐宋:可以的
        雨影:@吾名唐宋 有帮助就好

      本文标题:【IOS】UITextView实现placeHolder占位文字

      本文链接:https://www.haomeiwen.com/subject/howscxtx.html