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

     

     

     

     

     

  • 相关阅读:
    BZOJ 3041 水叮当的舞步
    Codevs 1744 格子染色==BZOJ 1296 粉刷匠
    洛谷P1077 摆花
    1256 打鼹鼠
    mybatis--面向接口编程
    柳峰微信公众平台开发教程企业号改动篇(企业菜单篇)
    com关于引用计数
    oracle用户管理实例
    用 JSQMessagesViewController 创建一个 iOS 聊天 App
    循环链表设计与API实现
  • 原文地址:https://www.cnblogs.com/StevenHuSir/p/UITextField_Placeholder.html
Copyright © 2011-2022 走看看