网络编程

当前位置:永利402游戏网站-永利402com官方网站 > 网络编程 > UITextView加多Placeholder

UITextView加多Placeholder

来源:http://www.xtcsyb.com 作者:永利402游戏网站-永利402com官方网站 时间:2019-09-11 14:45

SwpTextView

  • 在开发中, 顾客输入大批量文件音讯,苹果自带控件 UITextField已经满意不断我们供给,UITextView 未有 Placeholder 属性
  • 在这种供给的底子上,改造了下系统的 UITextView,使它具有了 Placeholder 效果

率先本子(并不能够周详的适配8.0iOS手提式有线电话机)

一最早利用kvc的不二等秘书籍,主要运用[self setValue:label forKey:@"_placeholderLabel"]对UITextView的私家属性进行赋值。

//  UITextView+Extension.m
//  UITextVIew-placeholder

#import "UITextView+Extension.h"
#import <objc/runtime.h>

@implementation UITextView (Extension)

+ (void)load {

    // 获取类方法 class_getClassMethod
    // 获取对象方法 class_getInstanceMethod

    Method setFontMethod = class_getInstanceMethod(self, @selector(setFont:));
    Method was_setFontMethod = class_getInstanceMethod(self, @selector(was_setFont:));

    // 交换方法的实现
    method_exchangeImplementations(setFontMethod, was_setFontMethod);
}

- (void)was_setPlaceholderWithText:(NSString *)text Color:(UIColor *)color{
    //防止重复设置 cell复用等问题
    for (UIView *view in self.subviews) {
        if ([view isKindOfClass:[UILabel class]]) {
            [view removeFromSuperview];
        }
    }

    //设置占位label
    UILabel *label = [[UILabel alloc] init];
    label.text = text;
    label.font = self.font;
    label.textColor = color;

    [self addSubview:label];
    [self setValue:label forKey:@"_placeholderLabel"];

    //第一次会有位移
    self.text = @"1";
    self.text = @"";
}

- (void)was_setFont:(UIFont *)font{
    //调用原方法 setFont:
    [self was_setFont:font];
    //设置占位字符串的font
    UILabel *label = [self valueForKey:@"_placeholderLabel"];
    label.font = font;
    NSLog(@"%s", __func__);
}
@end

而后在bugly上发掘报错:

设备机型
iPhone 6 Plus

系统版本
8.1.3 (12B466)

崩溃内容:
[<UITextView 0x12d165200> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key _placeholderLabel.
LilyForParent -[UITextView(Extension) was_setPlaceholderWithText:Color:] (UITextView+Extension.m:)
bugly展现有错误日志,并非iOS8.0之上系统都援助,不可能找到
_placeholderLabel其一第一字,所以倍感KVC不可能使用,也不知晓是否其余的缘由。

效果

图片 1

改进型

导入

  • 手动导入:

    • SwpTextView 文件夹导入项目中
    • #import "SwpTextView.h"
  • CocoaPods 导入:

    • pod search SwpTextView
    • pod 'SwpTextView'
    • #import <SwpTextView/SwpTextView.h>

思路

经过runtime关联对象方法,关联贰个私有Label变量,达成占位字符串的功用。

行使办法调换将TextView的font与placeholderlabel的font绑定,相同的时间变化大小。

//
//  UITextView+Placeholder.m

#import "UITextView+Placeholder.h"
#import <objc/runtime.h>

static const char *kPlaceholderKey = "kPlaceholderKey";
static const char *kPlaceholderLabelKey = "kPlaceholderLabelKey";

@interface UITextView (PlaceholderLabel)<UITextViewDelegate>

@property (nonatomic, strong) UILabel *placeholderLabel;

@end

@implementation UITextView (Placeholder)

+ (void)load {

    // 获取类方法 class_getClassMethod
    // 获取对象方法 class_getInstanceMethod

    Method setFontMethod = class_getInstanceMethod(self, @selector(setFont:));
    Method was_setFontMethod = class_getInstanceMethod(self, @selector(was_setFont:));

    // 交换方法的实现
    method_exchangeImplementations(setFontMethod, was_setFontMethod);
}

- (void)was_setFont:(UIFont *)font{
    //调用原方法 setFont:
    [self was_setFont:font];
    //设置占位字符串的font
    if (self.placeholderLabel != nil) {
        self.placeholderLabel.font = font;
        NSLog(@"%s", __func__);
    }
}

- (UILabel *)placeholderLabel{
    return objc_getAssociatedObject(self, kPlaceholderLabelKey);
}

- (void)setPlaceholderLabel:(UILabel *)placeholderLabel{
    objc_setAssociatedObject(self, kPlaceholderLabelKey, placeholderLabel, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (NSString *)placeholder{
    return objc_getAssociatedObject(self, kPlaceholderKey);
}

- (void)was_setPlaceholderWithText:(NSString *)placeholder Color:(UIColor *)color{
    objc_setAssociatedObject(self, kPlaceholderKey, placeholder, OBJC_ASSOCIATION_COPY_NONATOMIC);

    UILabel *label = [[UILabel alloc] init];
    label.text = placeholder;
    label.textColor = color;
    label.numberOfLines = 0;
    [label sizeToFit];
    [self addSubview:label];

    self.placeholderLabel = label;

    self.delegate = self;
}

- (void)layoutSubviews{
    [super layoutSubviews];
    //5  7.75是实验后得出的完美位置,如有需求可以修改
    self.placeholderLabel.frame = CGRectMake(5, 7.75, self.frame.size.width, self.frame.size.height);
    [self.placeholderLabel sizeToFit];
}

- (void)textViewDidChange:(UITextView *)textView{
    self.placeholderLabel.hidden = !(self.text.length == 0);
}

@end

SwpTextView 下载地址

  • SwpTextView
  • 假使喜欢, 迎接 Star。

运用格局

直白将UITextView+Placeholder.h和UITextView+Placeholder.m拖入项目中,在需求使用TextView的调节器内导入,调用下边方法可以

- (void)was_setPlaceholderWithText:(NSString *)placeholder Color:(UIColor *)color;
  • 一经有好的提出足以直接留言可能发送邮件:andysection@gmail.com

Thank you for your reading !

Github:Demo

备注

  • 个体博客
  • swp-song GitHub

声明

  • 作者:swp-song
  • 地址: SwpTextView/
  • 版权注解:All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
  • 小说权归 ©swp_song, 如需转载请标记出处。

本文由永利402游戏网站-永利402com官方网站发布于网络编程,转载请注明出处:UITextView加多Placeholder

关键词:

上一篇:iOS,图片轮播器 SwpBanner

下一篇:没有了