ios uitextview 输入跳动蓝色背景是什么回事

iOS UITextView 输入内容实时更新cell的高度
招聘信息:
这篇文章介绍了在一个动态数据的 table view 中,cell 根据 text view 内容的输入实时改变 cell 和 table view 的高度。自动计算 cell 高度的功能使用 iOS 8 才支持的自适应 cell,如果你还不知道 iOS 8 自适应 cell,可以参看这篇文章:先上图,我们最终要实现的效果是这样的:图 1:实时更新 cell 高度实现上面效果的基本原理是:在 cell 中设置好 text view 的 autolayout,让 cell 可以根据内容自适应大小text view 中输入内容,根据内容更新 textView 的高度调用 tableView 的 beginUpdates 和 endUpdates,重新计算 cell 的高度将 text view 更新后的数据保存,以免 table view 滚动超过一屏再滚回来 text view 中的数据又不刷新成原来的数据了。功能具体实现方法新建一个项目,拉出 TableViewController,在 cell 上添加一个 UITextView。首先设置 text view 的 autolayout,比较关键的 constraint 是要设置 textView 的高度大于等于一个值。如图:图 2: Text view 的 autolayout 设置然后,设置 UITextView 的 scrollEnable 为 NO。这一点很关键,如果不设置为 NO,UITextView 在内容超出 frame 后,重新设置 text view 的高度会失效,并出现滚动条。图 3:去掉 scrolling enable 勾选根据刚才在 storyboard 中创建的 cell,新建一个 UITableViewCell 类。#import&
@interface&TextViewCell&:&UITableViewCell
@property&(weak,&nonatomic)&IBOutlet&UITextView&*textV
@end创建 TableViewController 并初始化一些数据#import&"TableViewController.h"
#import&"TextViewCell.h"
@interface&TableViewController&()
@property&(nonatomic,&strong)&NSArray&*
@implementation&TableViewController
-&(void)viewDidLoad&{
&&[super&viewDidLoad];
&&//&&支持自适应&cell
&&self.tableView.estimatedRowHeight&=&100;
&&self.tableView.rowHeight&=&UITableViewAutomaticD
&&self.data&=&@[@"Cell&1&",&@"Cell&2",&@"Cell&3",&@"Cell&4",&@"Cell&5",&@"Cell&6",&@"Cell&7",&@"Cell&8"];
#pragma&mark&-&Table&view&data&source
-&(NSInteger)tableView:(UITableView&*)tableView&numberOfRowsInSection:(NSInteger)section&{
&&return&[self.data&count];
-&(UITableViewCell&*)tableView:(UITableView&*)tableView&cellForRowAtIndexPath:(NSIndexPath&*)indexPath&{
&&TextViewCell&*cell&=&[tableView&dequeueReusableCellWithIdentifier:@"TextViewCell"&forIndexPath:indexPath];
&&cell.textView.text&=&self.data[indexPath.row];
}使用上面的代码项目已经可以运行了,但是 text view 还不能自动更新大小,下面来实现 text view 根据内容计算高度。先在 storyboard 中,将 UITextView 的 delegate 设置为 cell图 4:设置 UITextView 的 delegate 为 cell在 TextViewCell.m 中实现 - (void)textViewDidChange:(UITextView *)textView,每次 text view 内容改变的时候,就重新计算一次 text view 的大小,并让 table view 更新高度。#import&"TextViewCell.h"
@implementation&TextViewCell
-&(void)textViewDidChange:(UITextView&*)textView
&&CGRect&bounds&=&textView.
&&//&计算&text&view&的高度
&&CGSize&maxSize&=&CGSizeMake(bounds.size.width,&CGFLOAT_MAX);
&&CGSize&newSize&=&[textView&sizeThatFits:maxSize];
&&bounds.size&=&newS
&&textView.bounds&=&
&&//&让&table&view&重新计算高度
&&UITableView&*tableView&=&[self&tableView];
&&[tableView&beginUpdates];
&&[tableView&endUpdates];
-&(UITableView&*)tableView
&&UIView&*tableView&=&self.
&&while&(![tableView&isKindOfClass:[UITableView&class]]&&&&tableView)&{
&&&&tableView&=&tableView.
&&return&(UITableView&*)tableV
@end这样就已经实现了 text view 改变内容自动更新 cell 高度的功能,这篇文章没有涉及到计算 cell 高度的代码,因为计算 cell 高度的工作全部交给 iOS 8 的 autolayout 自动计算了,这让我们少写了许多令人痛苦的代码。最后:为了防止 table view 过长,导致滚动后重新加载 cell,会让 text view 中的内容还原的问题,我们应该在更新了 text view 的内容之后保存数据。(如果是在编辑状态下,还需要考虑取消编辑后的回滚功能。 普通数组数据,可以保存一个原始数据的副本,如果用户取消编辑,就设置 data 为原始数据的副本。如果是 NSManagedObject 对象可以使用 NSUndoManage,不过这些已经超出本篇文章的内容范围了。)为了在 text view 更新后能让 TableViewController 中的 data 更新,需要为 cell 添加一个 delegate,在 text view 更新后调用 delegate,TableViewController 中收到 delegate 信息后更新 data。修改后的 TextViewCell.h#import&
@protocol&TextViewCellD
@interface&TextViewCell&:&UITableViewCell
@property&(weak,&nonatomic)&IBOutlet&UITextView&*textV
@property&(weak,&nonatomic)&id&
@protocol&TextViewCellDelegate&
-&(void)textViewCell:(TextViewCell&*)cell&didChangeText:(NSString&*)
@end在 TextView.m的 - (void)textViewDidChange:(UITextView *)textView 中添加 delegate 的调用-&(void)textViewDidChange:(UITextView&*)textView
&&if&([self.delegate&respondsToSelector:@selector(textViewCell:didChangeText:)])&{
&&&&[self.delegate&textViewCell:self&didChangeText:textView.text];
&&//&计算&text&view&的高度
&&//&让&table&view&重新计算高度
}最后在 TableViewController.m 的最后实现 TextViewCellDelegate 的方法,更新 data#pragma&mark&-&TextViewCellDelegate
-&(void)textViewCell:(TextViewCell&*)cell&didChangeText:(NSString&*)text
&&NSIndexPath&*indexPath&=&[self.tableView&indexPathForCell:cell];
&&NSMutableArray&*data&=&[self.data&mutableCopy];
&&data[indexPath.row]&=&
&&self.data&=&[data&copy];
}总结从最后的代码量来看,这个功能在实现上并不难。只要记住的几点:使用 iOS 8 的特性自动计算 cell 高度,或者在 heightForRow 中自己实现计算高度的代码。UITextView 的 scrollEnable 要设置 NO更新 table view 的高度使用 beginUpdates 和 endUpdatesText view 更新内容后要保存数据,以免重新加载 cell 时数据丢失参考
微信扫一扫
订阅每日移动开发及APP推广热点资讯公众号:CocoaChina
您还没有登录!请或
点击量16272点击量10875点击量8664点击量8017点击量7488点击量7063点击量6588点击量6497点击量5716
&2016 Chukong Technologies,Inc.
京公网安备89arthurchen 的BLOG
用户名:arthurchen
文章数:108
评论数:237
访问量:254339
注册日期:
阅读量:5863
阅读量:12276
阅读量:336207
阅读量:1040222
51CTO推荐博文
UITextView 是直角边, 和UITextField相比看起来比较丑!&
不幸的, UITextView没有选项设置一个好的边框。 有很多方法可以做这件事, 比如为UITextView创建一个自己的背景图片,但是我发现一个相对简单的方式来实现这个功能,并且是没有photoshop技能的人也能完成。
我在UITextView后面放了一个UITextField。不过,在 InterfaceBuilder 里面你不能修改UITextField的高度,所以你必须通过文本编辑器来改变它的高度。
你需要做以下几步:
1.添加一个 UITextField到view上,并在上面放一个UItextView
2.决定并设置你的UITextView的高度并设置。
3.给UITextField 设置Tag为999 (或者任何你的想要的) (点击CMD-1& 调出attributes inspector 来设置).
4.保存.xib 文件然后右键点击文件,打开, 其他方式,选择TextEdit
5.搜索tag, 999, 设置成相同的高度.
650) this.width=650;" title="Screen shot
at 20.22.29" alt="Screen shot
at 20.22.29" height="300" src="/wp-content/uploads/2010/06/Screen-shot--at-20.22.29-161x300.png" />
了这篇文章
类别:┆阅读(0)┆评论(0)
17:05:51 17:08:36 19:16:19 16:49:00 17:11:20 09:09:23iOS软件开发(25)
& &昨天在使用UITextView时,发现输入起始位置不在左上角,而是从中间开始,所以研究了一下,发现只要加上下面一行代码即可搞定。
self.automaticallyAdjustsScrollViewInsets=NO;
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:5716次
排名:千里之外
原创:50篇
(1)(7)(17)(21)(4)(1)}

我要回帖

更多关于 uitextview背景图片 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信