如何轻工业实现首次正增长UITextView的自增长

UITextFiled/UITextView占位文字的设置
#UITextFiled/UITextView--占位文字
案例说明--以UITextFiled为例
自定义一个UITextFiled
在storyboard中拖入两个TextFiled继承于自定义的UITextFiled
在自定义UITextFiled类中对占位文字进行统一设置
一.占位文字--添加
方法一:使用代码添加占位文字
统一设置占位文字的内容
self.placeholder = @&hahaha&;
方法二:使用Xcode修改添加占位文字
优点:可以分别设置文本框的占位文字
二.占位文字--修改属性值
方法一:使用UITextFiled的属性:attributedPlaceholder
查找技巧:进入头文件(或者继承的父类头文件)中查找
一般在placeholder附近
self.attributedPlaceholder = [[NSAttributedString alloc] initWithString:self.placeholder attributes:@{NSForegroundColorAttributeName:[UIColor grayColor]}];
※补充知识: 富文本--带有属性的字符串
富文本用法
用法一:不可变的属性文字
使用不可变的属性文字NSAttributedString设置占位文字的背景色
富文本用法1 - 不可变的属性文字
self.attributedPlaceholder = [[NSAttributedString alloc] initWithString:self.placeholder attributes:@{NSForegroundColorAttributeName:[UIColor grayColor]}];
用法二:可变的属性文字
利用可变的属性文字NSMutableAttributedString可以实现设置每个占位文字的颜色/字体不同
//富文本用法2 - 可变的属性文字
NSMutableDictionary *attr = [NSMutableDictionary dictionary];
attr[NSForegroundColorAttributeName] = [UIColor grayColor];
NSMutableAttributedString
*string = [[NSMutableAttributedString alloc] initWithString:self.placeholder];
[string setAttributes:attr range:NSMakeRange(0, 1)];
self.attributedPlaceholder =
用法三:图文混排
实现功能:利用可变的属性文字,存放拼接的不可变的属性文字
利用不可变属性文字存放图片需要在不可变属性文字创建的时候设置一个父控件NSTextAttachment
父控件NSTextAttachment有image属性,可以用来存放图片
//1.创建可变属性文字存放不同属性文字
NSMutableAttributedString *string = [[NSMutableAttributedString alloc] init];
//2.创建第1个不可变属性文字
NSAttributedString *str1 = [[NSAttributedString alloc] initWithString:self.placeholder];
//拼接不可变属性文字
[string appendAttributedString:str1];
//3.创建第2个带图片的不可变属性文字
//NSTextAttachment用于存放图片信息的父控件
NSTextAttachment *att = [[NSTextAttachment alloc] init];
att.image = [UIImage imageNamed:@&header_cry_icon&];
NSAttributedString *str2 = [NSAttributedString attributedStringWithAttachment:att];
//图片进行微调
att.bounds = CGRectMake(0, -2, 16, 16);
//拼接不可变属性文字
[string appendAttributedString:str2];
//4.创建第3个不可变属性文字
NSAttributedString *str3 = [[NSAttributedString alloc] initWithString:@&&];
//拼接不可变属性文字
[string appendAttributedString:str3];
//5.设置UITextFiled显示自定义的占位文字
self.attributedPlaceholder =
方法二:使用UITextFiled的方法:drawPlaceholderInRect
可以在drawPlaceholderInRect画出占位文字
方法1: 使用drawInRect画
方法2: 使用drawAtPoint画
- (void)drawPlaceholderInRect:(CGRect)rect
//设置文字的属性
NSMutableDictionary *attr = [NSMutableDictionary dictionary];
attr[NSFontAttributeName] = self.
attr[NSForegroundColorAttributeName] = [UIColor whiteColor];
//方法一:drawInRect
//文字所在矩形框
CGRect placeholderRect =
placeholderRect.origin.y = (self.height - self.font.lineHeight)/2;
//InRect画占位文字
[self.placeholder drawInRect:placeholderRect withAttributes:attr];
//方法二:drawAtPoint
//文字所在坐标
point.x = 0;
point.y = (self.height - self.font.lineHeight)/2;
//AtPoint画占位文字
[self.placeholder drawAtPoint:point withAttributes:attr];
方法三:使用UITextFiled的私有成员变量placeholderLabel
根据开发经验可以猜出,UITextFiled的占位文字可能是由一个UILabel来控制的
使用运行时(runtime)打印出UITextFiled的所有成员变量查看有没有关于占位文字UILabel类型的变量
打印得出 有一个私有成员变量placeholderLabel
可以利用KVC对私有成员变量 placeholderLabel进行属性值的修改
运行时打印UITextFiled的所有成员变量
#import &objc/runtime.h&
//获得所有的成员变量
unsigned int outCount = 0;
Ivar *ivars = class_copyIvarList([UITextFiled class], &outCount);
//打印出所有成员变量名
for (int i = 0; i&outC i++) {
Ivar ivar = ivars[i];
NSLog(@&%s&,ivar_getName(ivar));
//手动释放
free(ivars);
使用KVC修改私有成员变量placeholderLabel的属性达到修改占位文字的效果
//先用KVC取出palceholderLabel,再修改(不如下面代码简洁)
UILabel *palceholderLabel = [self valueForKey:@&placeholderLabel&];
palceholderLabel.textColor = [UIColor grayColor];
//注意forKeyPath 和forKey 区别
[self setValue:[UIColor grayColor] forKeyPath:@&placeholderLabel.textColor&];
三.UITextFiled之间的占位文字切换颜色
方法一:使用代理
自己设置自己为代理,这种做法很SB,不要用,原因如下.
代理是一个类的属性,只能赋一个值
如果这时候需要在这个类中,设置别的类的代理为这个类就会产生冲突,这时候自己设置自己为代理就会被覆盖永远不会是实现自己代理的方法
self.deleagte =
//实现代理方法
#pragma mark - &UITextFieldDelegate&
- (void)textFieldDidBeginEditing:(UITextField *)textField
[self setValue:[UIColor whiteColor] forKeyPath:@&placeholderLabel.textColor&];
- (void)textFieldDidEndEditing:(UITextField *)textField
[self setValue:[UIColor grayColor] forKeyPath:@&placeholderLabel.textColor&];
方法二:使用addTarget(必须继承于UIControl)
使用addTarget添加监听,实现方法处理事件
[self addTarget:self action:@selector(beginEditing) forControlEvents:UIControlEventEditingDidBegin];
[self addTarget:self action:@selector(endEditing) forControlEvents:UIControlEventEditingDidEnd];
- (void)beginEditing
[self setValue:[UIColor whiteColor] forKeyPath:@&placeholderLabel.textColor&];
- (void)endEditing
[self setValue:[UIColor grayColor] forKeyPath:@&placeholderLabel.textColor&];
方法三:使用通知
注意 使用通知必须要在dealloc中取消通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(beginEditing) name:UITextFieldTextDidBeginEditingNotification object:self];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(endEditing) name:UITextFieldTextDidEndEditingNotification object:self];
- (void)beginEditing
[self setValue:[UIColor whiteColor] forKeyPath:@&placeholderLabel.textColor&];
- (void)endEditing
[self setValue:[UIColor grayColor] forKeyPath:@&placeholderLabel.textColor&];
- (void)dealloc
[[NSNotificationCenter defaultCenter] removeObserver:self];
方法四:重写系统的响应者方法becomeFirstResponder和resignFirstResponder
- (BOOL)becomeFirstResponder
[self setValue:[UIColor whiteColor] forKeyPath:@&placeholderLabel.textColor&];
return [super becomeFirstResponder];
- (BOOL)resignFirstResponder
[self setValue:[UIColor grayColor] forKeyPath:@&placeholderLabel.textColor&];
return [super resignFirstResponder];
代码规范化处理
以上代码只设置了两种颜色(聚焦颜色和失去焦点的颜色)
#define placeholderDefaultColor [UIColor grayColor]
#define placeholderEditingColor [UIColor whiteColor]
#define placeholderColor @&placeholderLabel.textColor&
> 本站内容系网友提交或本网编辑转载,其目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请及时与本网联系,我们将在第一时间删除内容!
原生TextView无占位文字, 可通过drawRect:方法为其添加占位文字, 具体设置如下: 1. 获取当前占位文字属性: // 文字属性 NSMutableDictionary *attrs = [NSMutableDictionary dictionary]; attrs[NSFontAttributeName] = self. // 获取 ...
猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u 一:效果 二:代码: 由于系统自带的UITextField:和UITextView:不能满足我们的需求,所以我们需要自己设计一个. UITextField: 1.文字永远是一行,不能显示多行文字 2.有placehoder属 ...
在实际iOS应用开发中我们经常会用到类似于下图所示的界面,即带有占位文字的文本框:
其实在开发中,我们会自然而然地用到一种思想,就是我们所需求的界面,使用系统自带的控件可以实现其部分功能,但有些功能系统自带的控件无法实现.这个时候我们一般会想到自定义一个控件,继承于系统自带的控件,并给它添加额外的功能. 此时,依据这种思想,根据需求,我们很容易联 ...
自定义TextView 在使用textView的时候,我们如果希望它拥有textField的占位文字的功能,就要自定义了. 先看自定义的流程: 下面给出具体的代码: (后面有注意点讲解) //.h文件 #import &UIKit/UIKit.h& @interface XYLPlaceHodlerTextView : UITextView /* ...
&SPAN style=&FONT-SIZE: 16px&&&TextView
android:id=&@+id/text&
android:layout_width=&wrap_content&
android:layout_height=&w ...
在UITextField中自带placeholder属性,可以用于提示输入框信息.但是UITextView并不具备此功能介绍两种方法来实现:第一种:初始化UITextView//首先定义UITextView UITextView *textView = [[UITextView alloc] init]; textView.font = [UIFont sy ...
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(50, 50, 150, 50)];
[button setTitle:@&HHH& forState:UIControlStateNormal];
[button setBackground ...
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(50, 50, 150, 50)];
[button setTitle:@&HHH& forState:UIControlStateNormal];
[button setBackgroundImag ...自适应高度的UITextView的实现-牛逼轰轰的产品
记录苦逼的产品培育过程......
LOFTER app需要实现了一个类似iPhone短信输入框的功能,它的功能其实蛮简单,就是:【UITextView的高度随着内容高度的变化而变化】。实现思路应该是:在UITextView的textChanged事件响应代码里计算输入内容的高度,然后如果高度与文本变化前比起来有变化,则修改UITextView的高度为这个新的高度。这看起来很简单。添加内容变化的通知响应事件:[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChanged:) name: UITextViewTextDidChangeNotification object:nil];计算内容高度有两种方式:计算输入文字在指定字体、指定容器和指定换行方式下的size.CGSize newSize = [textView.text& & & & & & sizeWithFont:[UIFont fontWithName:@"Helvetica" size:14]& & & & & & constrainedToSize:CGSizeMake(222,9999)& & & & & & lineBreakMode:UILineBreakModeWordWrap];& & 2. &textView继承自UIScrollView,直接从contentSize属性获取textView.contentSize.height第一种方式拿出来的高度需要再加上padding的值才是最终的值,并且需要指定constrainedToSize,不太灵活。第二种方法简单直接准确,我选择了它。在IOS 5.0及以上,以上实现已经足够完美了。在IOS4.3中发现了bug,当文本框变成多行,然后清空文本框再输入文字时,发现内容和光标跑到了UITextView上方并且不可见。Google关键字"one line uitextview"可以发现类似的bug提问。经过查证资料和跟踪代码,根本原因应该UITextView的Insets.bottom在文本输入的过程中被不断地自动设置造成的。这是UITextView的默认实现行为,但这肯定是IOS4.3的bug,而IOS5.0修复了它。解决办法就是试图阻止UITextView设置contentInset,我们可以继承UITextView并且覆盖setContentInset:方法来达到目的,在setContentInset:里只需要设置一个固定的contentInset.bottom即可。还有一个地方需要注意,当你清空输入框时(_textView.text=@"";),不会自动触发textChanged:,你需要重写setText:方法来调用textChanged:。并且你清空textview后,你拿到的contentsize也不准确,所以还需要根据text是否为空来设定一个最小的高度。参考:
很喜欢此文字
很喜欢此文字
很喜欢此文字3326人阅读
iOS(120)
上节地址:http://blog.csdn.net/lwjok2007/article/details/
接着上节我们来实现 输入框自动调节高度
首先,我们得知道,要判断是否该换行了 前提是得知道 一行可以输入多少文字,
我们很容易能知道我们输入框的宽度,那么下来只要知道每个文字的宽度就可以计算一行文字的个数了
然后根据文字文字高度计算每超过一行我们需要给textView 添加的高度
首先要计算每个文字的宽度和高度(我们按照正方形处理)
我们用到了 一个方法&sizeWithAttributes
他为我们提供了计算文字大小的方法,具体大家可以去研究api 这里我们直接使用
首先新建一个变量
float heightT//文字高度
然后使用该方法计算高度(前提是,文字的大小得提前知道,我们就按照20 计算)
NSDictionary *dict=@{NSFontAttributeName:[UIFont systemFontOfSize:20.0]};
CGSize contentSize=[@&我& sizeWithAttributes:dict];
heightText=contentSize.
接下来我们需要在文本框内容变化的时候计算所有文字的长度,判断是否超过了文本框宽度
实现&UITextViewDelegate&协议的&
-(void)textViewDidChange:(UITextView *)textView &方法检测文字修改
@interface CommentView()&UITextViewDelegate&
-(void)textViewDidChange:(UITextView *)textView
float currentLineNum=1;//默认文本框显示一行文字
float textViewWidth=self.textView.frame.size.//取得文本框高度
NSString *content=textView.
NSDictionary *dict=@{NSFontAttributeName:[UIFont systemFontOfSize:20.0]};
CGSize contentSize=[content sizeWithAttributes:dict];//计算文字长度
float numLine=ceilf(contentSize.width/textViewWidth); //计算当前文字长度对应的行数
if(numLine&currentLineNum ){
//如果发现当前文字长度对应的行数超过。 文本框高度,则先调整当前view的高度和位置,然后调整输入框的高度,最后修改currentLineNum的值
self.frame=CGRectMake(self.frame.origin.x, self.frame.origin.y-heightText*(numLine-currentLineNum), self.frame.size.width, self.frame.size.height+heightText*(numLine-currentLineNum));
textView.frame=CGRectMake(textView.frame.origin.x, textView.frame.origin.y, textView.frame.size.width, textView.frame.size.height+heightText*(numLine-currentLineNum));
currentLineNum=numL
}else if (numLine&currentLineNum ){
//次数为删除的时候检测文字行数减少的时候
self.frame=CGRectMake(self.frame.origin.x, self.frame.origin.y+heightText*(currentLineNum-numLine), self.frame.size.width, self.frame.size.height-heightText*(currentLineNum-numLine));
textView.frame=CGRectMake(textView.frame.origin.x, textView.frame.origin.y, textView.frame.size.width, textView.frame.size.height-heightText*(currentLineNum-numLine));
currentLineNum=numL
好了 下来我们尝试 测试一下 看效果出来没
最后再给大家提点小问题 尝试解决一下
比如说我们做评论view 行数不能无限增长要不然超出了屏幕。
我们如果限制文本框最高三行,超过三行的时候就不再增加,让文本框通过滑动解决,同时删除的时候也要让文本框高度减小最少一行
大家可以试试
有什么问题可以加群讨论
代码上传至群空间 【文本框高度自动调整1.zip】
苹果开发群 : &欢迎加入 &欢迎讨论问题
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:444496次
积分:4462
积分:4462
排名:第4510名
原创:133篇
评论:88条
(1)(19)(3)(1)(7)(2)(9)(23)(25)(14)(19)(1)(1)(1)(1)(4)(3)(1)(1)(2)(4)阅读人次:2370
要想实现根据uitextview的内容设置它外边scrollview的contentsize的高度,需要先计算出uitextview填充内容需要的高度,然后再设置scrollsize的高度为这个高度就可以了。计算uitextview填充内容所需要的高度有两种方法: OC代码
CGSize newSize = [textView.text.sizeWithFont:[UIFont fontWithName:@&Helvetica& size:14] constrainedToSize:CGSizeMake(222,9999) lineBreakMode:UILineBreakModeWordWrap];& & 2. &textView继承自UIScrollView,直接从contentSize属性获取 OC代码textView.contentSize.height第一种方式拿出来的高度需要再加上padding的值才是最终的值,并且需要指定constrainedToSize,不太灵活。第二种方法简单直接准确,我选择了它。在IOS 5.0及以上,以上实现已经足够完美了。在IOS4.3中发现了bug,当文本框变成多行,然后清空文本框再输入文字时,发现内容和光标跑到了UITextView上方并且不可见。Google关键字&one line uitextview&可以发现类似的bug提问。经过查证资料和跟踪代码,根本原因应该UITextView的Insets.bottom在文本输入的过程中被不断地自动设置造成的。这是UITextView的默认实现行为,但这肯定是IOS4.3的bug,而IOS5.0修复了它。解决办法就是试图阻止UITextView设置contentInset,我们可以继承UITextView并且覆盖setContentInset:方法来达到目的,在setContentInset:里只需要设置一个固定的contentInset.bottom即可。还有一个地方需要注意,当你清空输入框时(_textView.text=@&&;),不会自动触发textChanged:,你需要重写setText:方法来调用textChanged:。并且你清空textview后,你拿到的contentsize也不准确,所以还需要根据text是否为空来设定一个最小的高度。
我有我在下一篇:
我有我在上一篇:

我要回帖

更多关于 uitextview实现微博 的文章

 

随机推荐