iOS UITextView 根据输入text自适应高度
转载自:http://www.cnblogs.com/tmf-4838/p/5380495.html
#import "ViewController.h"
@interface ViewController ()<UITextViewDelegate>
// KVO和动态自适应尺寸
@property (nonatomic, strong)UITextView *txtView;
// KVO测试
@property (nonatomic, strong)Person *person;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// 1.字数大于label长度时循环播放
// 创建第三方控件lbl对象
BBFlashCtntLabel *BFLbl = [[BBFlashCtntLabel alloc] initWithFrame:CGRectMake(107, 100, 200, 50)];
// 更换背景色
BFLbl.backgroundColor = [UIColor purpleColor];
// 属性字符串
NSMutableAttributedString *attStr = [[NSMutableAttributedString alloc] initWithString:@"2016年1月,随着9.2.1版本的发布,苹果修复了一个存在了3年的漏洞。该漏洞在iPhone或iPad用户在酒店或者机场等访问带强制门户的网络时,登录页面会通过未加密的HTTP连接显示网络使用条款。在用户接受条款后,即可正常上网,但嵌入浏览器会将未加密的Cookie分享给Safari浏览器。利用这种分享的资源,黑客可以创建自主的虚假强制门户,并将其关联至WiFi网络,从而窃取设备上保存的任何未加密Cookie"];
// 字体
[attStr addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:25] range:NSMakeRange(0, attStr.length)];
// 字体背景色
[attStr addAttribute:NSBackgroundColorAttributeName value:[UIColor blueColor] range:NSMakeRange(0, attStr.length)];
// 字体前景色
[attStr addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:NSMakeRange(0, attStr.length)];
// 倒圆角
BFLbl.layer.cornerRadius = 15;
// 为label添加属性字符串
BFLbl.attributedText = attStr;
// 为label限定播放速度
BFLbl.speed = BBFlashCtntSpeedMild;
// 循环滚动次数(为0时无限滚动)
BFLbl.repeatCount = 0;
[self.view addSubview:BFLbl];
// 2.字数大于label长度时自定义尺寸
// 创建label对象
UILabel *lbl = [[UILabel alloc] init];
// 自适应大小因此行数为0
lbl.numberOfLines = 0;
// 设置背景色
lbl.backgroundColor = [UIColor redColor];
// 文本内容
lbl.text = @"2016年1月,随着9.2.1版本的发布,苹果修复了一个存在了3年的漏洞。该漏洞在iPhone或iPad用户在酒店或者机场等访问带强制门户的网络时,登录页面会通过未加密的HTTP连接显示网络使用条款。在用户接受条款后,即可正常上网,但嵌入浏览器会将未加密的Cookie分享给Safari浏览器。利用这种分享的资源,黑客可以创建自主的虚假强制门户,并将其关联至WiFi网络,从而窃取设备上保存的任何未加密Cookie";
// 设置文本颜色
lbl.textColor = [UIColor whiteColor];
// 设置自适应段落
NSMutableParagraphStyle *para = [NSMutableParagraphStyle new];
para.lineBreakMode = NSLineBreakByWordWrapping;
// 创建字典携带属性:尺寸取决于字体的font
NSDictionary *dic = @{NSFontAttributeName:lbl.font, NSParagraphStyleAttributeName:para};
// 获取字体的尺寸:lbl的font计算出来的
CGRect rect = [lbl.text boundingRectWithSize:CGSizeMake(300, CGRectGetHeight(self.view.frame)) options:NSStringDrawingUsesLineFragmentOrigin attributes:dic context:nil];
// 只是label的尺寸(高度取负值即可实现往上移动啦)
lbl.frame = CGRectMake(57, HEI-10, rect.size.width, -rect.size.height);
[self.view addSubview:lbl];
// 动态获取尺寸
_txtView = [[UITextView alloc] init];
_txtView.backgroundColor = [UIColor redColor];
_txtView.delegate = self;
_txtView.text = @"2016年1月,随着9.2.1版本的发布,苹果修复了一个存在了3年的漏洞。该漏洞在iPhone或iPad用户在酒店或者机场等访问带强制门户的网络时,登录页面会通过未加密的HTTP连接显示网络使用条款。";
[self textViewDidChange:_txtView];
NSLog(@"%@", self.txtView.font.fontDescriptor);
NSLog(@"%@", self.txtView.font.description);
[self.view addSubview:self.txtView];
// KVO
// 在UI中使用到KVO:一般系统控件都有事件监听大部分都是自定义类\
需要创建至少一个属性(即全局变量),如果是创建局部变量监听一次就会被销毁,再次改变程序就会崩溃\
因为在给监听者赋值是通过重写其setter来添加监听的,没有引用计数器加1,因此需要至少其一是全局变量
// 重写setter只是实现了监听:因此被监听者对象需要赋值给监听者,触发添加监听事件监听开始
self.person = [[Person alloc] init];
// 添加监听
Txt *tt = [Txt new];
tt.per = self.person;;
self.person.name = @"pp";
// 只能监听到赋值,在屏幕上录入不能监听到
tt.txtview = self.txtView;
self.txtView.text = @"11";
}
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
// text得到的是每次录入的字符,range.location为字符位置
return YES;
}
// 代理监听:当text改变即调用该方法
- (void)textViewDidChange:(UITextView *)textView
{
NSMutableParagraphStyle *para = [NSMutableParagraphStyle new];
para.lineBreakMode = NSLineBreakByWordWrapping;
// 创建字典携带属性:尺寸取决于字体的font
NSDictionary *dic = @{NSFontAttributeName:_txtView.font, NSParagraphStyleAttributeName:para};
// 获取字体的尺寸:lbl的font计算出来的
CGRect rect = [_txtView.text boundingRectWithSize:CGSizeMake(0,0) options:NSStringDrawingUsesFontLeading attributes:dic context:nil];
CGSize size = [_txtView sizeThatFits:CGSizeMake(100, rect.size.height)];
_txtView.frame = CGRectMake(100, 500, 100, -size.height);
#import <Foundation/Foundation.h>
@class UITextView, Person;
@interface Txt : NSObject
// 重写setter只是实现了监听:因此被监听者对象需要赋值给监听者,触发添加监听事件监听开始
@property (nonatomic, strong)UITextView *txtview;
@property (nonatomic, strong)Person *per;
#import "Txt.h"
#import "Person.h"
#import <UIKit/UIKit.h>
@implementation Txt
// 在UI中使用到KVO:一般系统控件都有事件监听大部分都是自定义类\
需要创建至少一个属性(即全局变量),如果是创建局部变量监听一次就会被销毁,再次改变程序就会崩溃\
因为在飞监听者赋值是通过重写其setter来添加监听的,没有引用计数器加1,因此需要至少其一是全局变量
// 添加监听
// 重写setter只是实现了监听:因此被监听者对象需要赋值给监听者,触发添加监听事件监听开始
- (void)setPer:(Person *)per
{
_per = per;
[self.per addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
}
// 添加监听
- (void)setTxtview:(UITextView *)txtview
{
_txtview = txtview;
[self.txtview addObserver:self forKeyPath:@"text" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
}
// 注册监听
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
{
if ([keyPath isEqualToString:@"name"])
{
NSLog(@"pp旧值.%@", [change objectForKey:NSKeyValueChangeOldKey]);
NSLog(@"pp新值.%@", [change objectForKey:NSKeyValueChangeNewKey]);
}else if ([keyPath isEqualToString:@"text"])
{
NSLog(@"txt旧值.%@", [change objectForKey:NSKeyValueChangeOldKey]);
NSLog(@"txt新值.%@", [change objectForKey:NSKeyValueChangeNewKey]);
}
}
// 移除监听:将指针设置为空
- (void)delete:(id)sender
{
[self.per removeObserver:self forKeyPath:@"name" context:nil];
self.per = nil;
[self.txtview removeObserver:self forKeyPath:@"text"];
self.txtview = nil;
}
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property (nonatomic, strong)NSString *name;
@end
#import "Person.h"
@implementation Person
/*
- (instancetype)init
{
if (self = [super init])
{
_name = @"****";
}
return self;
}
*/
- (NSString *)description
{
return [NSString stringWithFormat:@"%@", _name];
}
@end
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[self.view endEditing:YES];
}
iOS UITextView 根据输入text自适应高度的更多相关文章
- html5  textarea 文本框根据输入内容自适应高度
		<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ... 
- IOS UITextView支持输入、复制、粘贴、剪切自定义表情
		UITextView是ios的富文本编辑控件,除了文字还可以插入图片等.今天主要介绍一下UITextView对自定义表情的处理. 1.首先识别出文本中的表情文本,然后在对应的位置插入NSTextAtt ... 
- 文本框textarea根据输入内容自适应高度 和输入中文和数字换行解决方法
		textarea内容可从后台读取或手动输入,常规输入后中文和数字会出现换行问题 <style> #textarea { display: block; margin: 0 auto; ov ... 
- 自适应高度输入框(contenteditable/textarea)
		一.用div模拟textarea div模拟输入域可以根据输入内容自动伸缩,而input和textarea输入内容较多时,高度固定,内容会显示不全. 1.坑1(IOS端无法输入) 在取消全局默认样 ... 
- 一步一步学ios UITextView(多行文本框)控件的用法详解(五5.8)
		本文转载至 http://wuchaorang.2008.blog.163.com/blog/static/48891852201232014813990/ 1.创建并初始化 创建UIText ... 
- Jquery实现textarea根据文本内容自适应高度
		本文给大家分享的是Jquery实现textarea根据文本内容自适应高度,这些在平时的项目中挺实用的,所以抽空封装了一个文本框根据输入内容自适应高度的插件,这里推荐给小伙伴们. autoTextare ... 
- vue-textarea 自适应高度
		需求简介 一个搜索页面,上面输入框,下面列表展示搜索到的结果. 重点是:产品要求搜索框默认显示一行,当输入的文字超过一行时,输入框的高度会随着改变,直到输入完毕. 解决思路设想 本想利用textare ... 
- IOS UITextView自适应高度
		LOFTER app需要实现了一个类似iPhone短信输入框的功能,它的功能其实蛮简单,就是:[UITextView的高度随着内容高度的变化而变化].实现思路应该是: 在UITextView的text ... 
- iOS UITextView 输入内容实时更新cell的高度
		iOS UITextView 输入内容实时更新cell的高度 2014-12-26 11:37 编辑: suiling 分类:iOS开发 来源:Vito Zhang'blog 11 4741 UIT ... 
随机推荐
- 浙大pat1009题解
			1009. Product of Polynomials (25) 时间限制 400 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yu ... 
- cocos2d-html5 之重要概念
			1,CCDirector:导演: 2,CCCamera: 摄像机:细到每个节点都要用摄像机,例如节点发生放大,缩小,旋转的时候,要继承摄像机,让其重新渲染: 3,CCScene:场景,拍电影时的一段剪 ... 
- Grunt使用教程(限winows)
			前提:安装nodejs 一. 打开dos命令窗口,输入命令 "node -v",确认nodejs安装成功 二. 其次,安装grunt-cli (该插件是grunt命令行插件),执行 ... 
- html绑定
			目的 html绑定可以绑定DOM元素内的HTML内容. 示例: <div data-bind="html: details"></div> <scri ... 
- 从P1到P7——我在淘宝这7年(转)
			作者: 赵超 发布时间: 2012-02-25 14:47 阅读: 114607 次 推荐: 153 [收藏] (一) 2011-12-08 [原文链接] 今天有同事恭喜我,我才知道自己在淘 ... 
- JAVA MONGODB  group查询的UTC时间问题
			BasicDBList dateList = new BasicDBList(); dateList.add("$t"); dateList.add(28800000); DBOb ... 
- PHP编程----猴子选大王
			<?php/** * 猴子选大王 * 17个猴子围成一圈,从某个开始报数1-2-3-1-2-3---报"3"的猴子就被淘汰, * 游戏一直进行到圈内只剩一只猴子它就是猴大王了 ... 
- Java Day03 面向对象程序设计
			1.面向对象 面向对象是指一种程序设计泛型,同时也是一种程序开发的方法. 2.类 类是一种抽象的概念,类中包含了数据与对数据的操纵. 具有相同特性(数据元素)和行为(功能)的对象的抽象就是类.类是对象 ... 
- 微信小程序支付步骤
			http://blog.csdn.net/wangsf789/article/details/53419781 最近开发微信小程序进入到支付阶段,一直以来从事App开发,所以支付流程还是熟记于心的.但 ... 
- openstack私有云布署实践【12.1 网络Neutron-controller节点配置(科兴环境)】
			网络这一块推荐使用的是 Neutron--LinuxBirdge的Ha高可用,此高可用方案对Public作用不是很大,Public只用到DHCP,而Private则会用到L3 Agent,则此方案是有 ... 
