如何给TextView添加placeholder属性

UITextField 有个系统自带的文本提示文字也就是placeholder属性,大家应该都知道,最常见的就用在搜索框上面的提醒文字。但是UITextField因为只能输入一行文字的原因,可能有时候不能满足我们的需求,这时候 UITextView 这个控件就派到用场了。但是UITextView虽然支持输入多行文字,却没有像 UITextField那样有个placeholder属性给我们调用,本文就是教大家如何给  UITextView 增加一个 placeholder属性。废话不多少,我们开始:

(一)我们先新建一个继承自 UITextView 的 自定义控件 JSTextView。

  (二)  然后在 - (instancetype)initWithFrame:(CGRect)frame 的里面初始化一个 UILabel。没错,我的思路就是用一个 UILabel 来实现 placeholder 效果。具体代码如下:

JSTextView.h 文件

这里我们暴露出 一个文字和文字颜色属性,能够方便我们使用的时候设置这些属性!


#import <UIKit/UIKit.h>

@interface JSTextView :UITextView

@property(nonatomic,copy) NSString *myPlaceholder;  //文字

@property(nonatomic,strong) UIColor *myPlaceholderColor; //文字颜色

@end


JSTextView.m 文件

#import"JSTextView.h"

@interface JSTextView()

@property (nonatomic,weak) UILabel *placeholderLabel; //这里先拿出这个label以方便我们后面的使用

@end

- (instancetype)initWithFrame:(CGRect)frame {

self = [super initWithFrame:frame]; 

if(self) {

self.backgroundColor= [UIColor clearColor];

UILabel *placeholderLabel = [[UILabel alloc]init];//添加一个占位label

placeholderLabel.backgroundColor= [UIColor clearColor];

placeholderLabel.numberOfLines=0; //设置可以输入多行文字时可以自动换行

[self addSubview:placeholderLabel];

self.placeholderLabel= placeholderLabel; //赋值保存

self.myPlaceholderColor= [UIColor lightGrayColor]; //设置占位文字默认颜色

self.font= [UIFont systemFontOfSize:15]; //设置默认的字体

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChange) name:UITextViewTextDidChangeNotification object:self]; //通知:监听文字的改变

}

return self;

}

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChange) name:UITextViewTextDidChangeNotification object:self]; //通知:监听文字的改变

这里我来解释下: 这个UITextViewTextDidChangeNotification通知会监听UITextView文字的改变,也就是说只要文字一改变就会调用这个通知的方法,利用这个我们可以控制  我们刚才在- (instancetype)initWithFrame:(CGRect)frame  方法里面初始化的  UILabel 的显示和隐藏:

#pragma mark -监听文字改变

- (void)textDidChange {

self.placeholderLabel.hidden = self.hasText;

}

这个 hasText  是一个 系统的 BOOL  属性,如果 UITextView 输入了文字  hasText 就是 YES,反之就为 NO。

(三)我们在  - (void)layoutSubviews 方法里面设置 UILabel 的 frame.

- (void)layoutSubviews {

[super layoutSubviews];

self.placeholderLabel.y=8; //设置UILabel 的 y值

self.placeholderLabel.x=5;//设置 UILabel 的 x 值

self.placeholderLabel.width=self.width-self.placeholderLabel.x*2.0; //设置 UILabel 的 x

//根据文字计算高度

CGSize maxSize =CGSizeMake(self.placeholderLabel.width,MAXFLOAT);

self.placeholderLabel.height= [self.myPlaceholder boundingRectWithSize:maxSize options:NSStringDrawingUsesFontLeading | NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : self.placeholderLabel.font} context:nil].size.height;

:- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(NSDictionary*)attributes context:(NSStringDrawingContext*)contextNS_AVAILABLE_IOS(7_0); 这个方法我来解释下:

以前我们想要获得 UILabel 文字的大小都用的下图的一系列接口:

但是 这些方法已经被苹果遗弃了,并且出现了新的方法,也就是上面的那个方法。


图1

(1)size参数: 宽高限制,用于计算文本绘制时占据的矩形块 。

(2)options参数: NSStringDrawingOptions 大家可以看看这个 官方介绍。在多行的情况下 至少要包含 NSStringDrawingUsesLineFragmentOrigin NSStringDrawingUsesFontLeading  这两个属性。

  (3) attributes参数: 这是个字典  @{NSFontAttributeName : self.placeholderLabel.font}  这里注意要成对的传。

(4)context参数 : 可以为 nil


(四)  重写我们 暴露出来的 文字 ,颜色以及系统的font 的 set方法 :

- (void)setMyPlaceholder:(NSString*)myPlaceholder{

_myPlaceholder= [myPlaceholder copy];

//设置文字

self.placeholderLabel.text= myPlaceholder;

//重新计算子控件frame

[self setNeedsLayout];

}

- (void)setMyPlaceholderColor:(UIColor*)myPlaceholderColor{

_myPlaceholderColor= myPlaceholderColor;

//设置颜色

self.placeholderLabel.textColor= myPlaceholderColor;

}

//重写这个set方法保持font一致

- (void)setFont:(UIFont*)font {

[super setFont:font];

self.placeholderLabel.font= font;

//重新计算子控件frame

[self setNeedsLayout];

}

(五) 重写 - (void)setText:(NSString*)text  以及 - (void)setAttributedText:(NSAttributedString*)attributedText 方法来控制 UILabel 的显示 和 隐藏

- (void)setText:(NSString*)text{

[super setText:text];

[self textDidChange]; //这里调用的就是 UITextViewTextDidChangeNotification 通知的回调

- (void)setAttributedText:(NSAttributedString*)attributedText {

[super setAttributedText:attributedText];

[self textDidChange]; //这里调用的就是UITextViewTextDidChangeNotification 通知的回调

}

(六) 最后别忘了销毁 通知

- (void)dealloc{

[[NSNotificationCenter defaultCenter]removeObserver:UITextViewTextDidChangeNotification];

}

(7) 如何使用 

- (void)setUpTextView {

JSTextView *textView = [[JSTextView alloc]initWithFrame:self.view.bounds];

[self.view addSubview:textView];

//1.设置提醒文字

textView.myPlaceholder=@"分享新鲜事...";

//2.设置提醒文字颜色

textView.myPlaceholderColor= [UIColorlightGrayColor];

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要给TextView添加文本,可以使用setText()方法。例如: TextView textView = findViewById(R.id.textView); textView.setText("这是要添加的文本"); ### 回答2: 在Android中,我们可以使用TextView来显示文本内容。要给TextView添加文本,可以使用setText()方法。 首先,在布局文件中声明一个TextView组件,例如: ```xml <TextView android:id="@+id/myTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" /> ``` 然后,在Java代码中找到TextView,并使用setText()方法来设置文本。例如: ```java TextView myTextView = findViewById(R.id.myTextView); myTextView.setText("这是我的文本内容"); ``` 这样,TextView就会显示出我们设置的文本内容:"这是我的文本内容"。 除了使用字符串作为文本内容之外,我们还可以使用资源文件中的字符串资源。首先,在res/values/strings.xml文件中定义一个字符串资源,例如: ```xml <string name="my_text">这是我的文本内容</string> ``` 然后,我们可以在Java代码中使用R.string来引用这个字符串资源,例如: ```java TextView myTextView = findViewById(R.id.myTextView); myTextView.setText(R.string.my_text); ``` 这样,TextView就会显示出我们在字符串资源文件中定义的文本内容。 总结起来,通过使用setText()方法并传递相应的文本内容,我们可以给TextView添加文本。 ### 回答3: 在Android中,要给TextView添加文本可以通过代码来实现。首先,我们需要找到TextView的实例,并将其与代码中的一个变量关联起来。可以使用findViewById方法来获取TextView的实例,该方法需要传入TextView在布局文件中设置的id。例如,如果我们在XML布局文件中将TextView的id设置为"tv_text",则可以使用以下代码来获取TextView的实例: ``` TextView textView = findViewById(R.id.tv_text); ``` 接下来,我们可以使用setText方法给TextView添加文本内容。该方法需要传入一个字符串作为参数,这个字符串将会显示在TextView中。例如,我们要给TextView显示"Hello, Android!",可以使用以下代码: ``` textView.setText("Hello, Android!"); ``` 如果想要给TextView添加变量或者动态的文本,我们可以将需要显示的内容保存在一个字符串变量中,然后通过setText方法将这个变量的值设置给TextView。例如,如果我们有一个名为"message"的字符串变量,其中保存了一条消息的内容,可以使用以下代码将这条消息显示在TextView中: ``` String message = "这是一条消息"; textView.setText(message); ``` 以上就是通过代码给TextView添加文本的方法。可以根据具体的需求进行相应的调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值