zoukankan      html  css  js  c++  java
  • Runtime实现设置placeholder的文本颜色

    1.基础办法:(在扩展中使用KVC获取属性的值)(先设置文本颜色,后设置placeholder, placeholder颜色无效)

    NS_ASSUME_NONNULL_BEGIN
    
    @interface UITextField (Placeholder)
    @property UIColor *placeholderColor;
    @end
    
    NS_ASSUME_NONNULL_END
    
    
    #import "UITextField+Placeholder.h"
    #import <objc/message.h>
    // 设置占位文字颜色
    //_textField.placeholderColor = [UIColor greenColor];
    // 设置占位文字:每次设置占位文字的后,在拿到之前保存占位文字颜色,重新设置
    // [_textField setHk_Placeholder:@"123"];
    
    @implementation UITextField (Placeholder)
     - (void)setPlaceholderColor:(UIColor *)placeholderColor
     {
     // 设置占位文字颜色
     UILabel *placeholderLabel = [self valueForKey:@"placeholderLabel"];
     placeholderLabel.textColor = placeholderColor;
     }
     
     - (UIColor *)placeholderColor
     {
     return nil;
     }
    @end
    // 基础方法 
    //设置占位文字:每次设置占位文字的后,在拿到之前保存占位文字颜色,重新设置
    // 分析:为什么先设置占位文字颜色,就没有效果 => 占位文字label拿不到

    2.使用Runtime实现

    NS_ASSUME_NONNULL_BEGIN
    
    @interface UITextField (Placeholder)
    @property UIColor *placeholderColor;
    @end
    
    NS_ASSUME_NONNULL_END
    
    
    #import "UITextField+Placeholder.h"
    #import <objc/message.h>
    // 设置占位文字颜色
    //_textField.placeholderColor = [UIColor greenColor];
    // 设置占位文字:每次设置占位文字的后,在拿到之前保存占位文字颜色,重新设置
    // [_textField setHk_Placeholder:@"123"];
    
    @implementation UITextField (Placeholder)
    + (void)load
    {
        // setPlaceholder
        Method setPlaceholderMethod = class_getInstanceMethod(self, @selector(setPlaceholder:));
        Method setHk_PlaceholderMethod = class_getInstanceMethod(self, @selector(setHk_Placeholder:));
        method_exchangeImplementations(setPlaceholderMethod, setHk_PlaceholderMethod);
    }
    - (void)setPlaceholderColor:(UIColor *)placeholderColor
    {
        
        // 给成员属性赋值 runtime给系统的类添加成员属性
        // 添加成员属性
        objc_setAssociatedObject(self, @"placeholderColor", placeholderColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
        
        // 获取占位文字label控件
        UILabel *placeholderLabel = [self valueForKey:@"placeholderLabel"];
        
        // 设置占位文字颜色
        placeholderLabel.textColor = placeholderColor;
    }
    
    - (UIColor *)placeholderColor
    {
        return objc_getAssociatedObject(self, @"placeholderColor");
    }
    
    // 设置占位文字
    // 设置占位文字颜色
    - (void)setHk_Placeholder:(NSString *)placeholder
    {
        [self setHk_Placeholder:placeholder];
        
        self.placeholderColor = self.placeholderColor;
    }
    
    @end

     

     

     

     

     

  • 相关阅读:
    Sql:主表与子表的最新记录级联查询
    发现eclipse红叉,查看markers发现Target runtime Apache Tomcat 6.0 is not defined
    The required Server component failed to start so Tomcat is unable to start问题解决
    Spring官网下载dist.zip的几种方法
    SPRING---------配置文件的命名空间
    eclipse中egit插件使用
    eclipse不自动弹出提示(alt+/快捷键失效)
    使用jenkins配置.net mvc网站进行持续集成
    windows系统的便签
    Linq to Entity 动态拼接查询条件(重点是OR)
  • 原文地址:https://www.cnblogs.com/StevenHuSir/p/UITextField_Placeholder.html
Copyright © 2011-2022 走看看