使用案例
.h文件
```
#import <UIKit/UIKit.h>
// 在定义类的前面加上IB_DESIGNABLE宏
IB_DESIGNABLE // 动态刷新
NS_ASSUME_NONNULL_BEGIN
@interface UITextView (HWCategory)
@property (nonatomic, strong) IBInspectable NSString *placeholder;
@property (nonatomic, strong) IBInspectable UIColor *placeholderColor;
@end
NS_ASSUME_NONNULL_END
```
.m文件
```
#import "UITextView+HWCategory.h"
#import <objc/runtime.h>
static NSString const *placeholderKey = @"placeholderKey";
static NSString const *placeholderLabelKey = @"placeholderLabelKey";
@implementation UITextView (HWCategory)
- (void)setPlaceholder:(NSString *)placeholder {
objc_setAssociatedObject(self, (__bridge const void * _Nonnull)(placeholderKey), placeholder, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
if (![self.subviews containsObject:self.placeholderLabel]) {
[self getPlaceholderLabel];
self.placeholderLabel.text = placeholder;
} else {
self.placeholderLabel.text = placeholder;
}
}
- (void)setPlaceholderColor:(UIColor *)placeholderColor {
if (![self.subviews containsObject:self.placeholderLabel]) { return; }
self.placeholderLabel.textColor = placeholderColor;
}
- (UIColor *)placeholderColor {
return self.placeholderLabel.textColor;
}
- (NSString *)placeholder {
return objc_getAssociatedObject(self, (__bridge const void * _Nonnull)(placeholderKey));
}
- (void)setPlaceholderLabel:(UILabel *)placeholderLabel {
objc_setAssociatedObject(self, (__bridge const void * _Nonnull)(placeholderLabelKey), placeholderLabel, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (UILabel *)placeholderLabel {
id label = objc_getAssociatedObject(self, (__bridge const void * _Nonnull)(placeholderLabelKey));
if (!label) {
[self getPlaceholderLabel];
}
return label;
}
- (UILabel *)getPlaceholderLabel {
if (!self.font) {
self.font = [UIFont systemFontOfSize:14];
}
UILabel *lab = [[UILabel alloc] initWithFrame:self.bounds];
lab.numberOfLines = 0;
lab.font = self.font;
lab.textColor = [UIColor lightGrayColor];
[self addSubview:lab];
[self setValue:lab forKey:@"_placeholderLabel"];
[self setPlaceholderLabel:lab];
[self sendSubviewToBack:self.placeholderLabel];
return lab;
}
@end
```