转载自: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自适应高度的更多相关文章

  1. html5 textarea 文本框根据输入内容自适应高度

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  2. IOS UITextView支持输入、复制、粘贴、剪切自定义表情

    UITextView是ios的富文本编辑控件,除了文字还可以插入图片等.今天主要介绍一下UITextView对自定义表情的处理. 1.首先识别出文本中的表情文本,然后在对应的位置插入NSTextAtt ...

  3. 文本框textarea根据输入内容自适应高度 和输入中文和数字换行解决方法

    textarea内容可从后台读取或手动输入,常规输入后中文和数字会出现换行问题 <style> #textarea { display: block; margin: 0 auto; ov ...

  4. 自适应高度输入框(contenteditable/textarea)

      一.用div模拟textarea div模拟输入域可以根据输入内容自动伸缩,而input和textarea输入内容较多时,高度固定,内容会显示不全. 1.坑1(IOS端无法输入) 在取消全局默认样 ...

  5. 一步一步学ios UITextView(多行文本框)控件的用法详解(五5.8)

    本文转载至 http://wuchaorang.2008.blog.163.com/blog/static/48891852201232014813990/     1.创建并初始化 创建UIText ...

  6. Jquery实现textarea根据文本内容自适应高度

    本文给大家分享的是Jquery实现textarea根据文本内容自适应高度,这些在平时的项目中挺实用的,所以抽空封装了一个文本框根据输入内容自适应高度的插件,这里推荐给小伙伴们. autoTextare ...

  7. vue-textarea 自适应高度

    需求简介 一个搜索页面,上面输入框,下面列表展示搜索到的结果. 重点是:产品要求搜索框默认显示一行,当输入的文字超过一行时,输入框的高度会随着改变,直到输入完毕. 解决思路设想 本想利用textare ...

  8. IOS UITextView自适应高度

    LOFTER app需要实现了一个类似iPhone短信输入框的功能,它的功能其实蛮简单,就是:[UITextView的高度随着内容高度的变化而变化].实现思路应该是: 在UITextView的text ...

  9. iOS UITextView 输入内容实时更新cell的高度

    iOS UITextView 输入内容实时更新cell的高度 2014-12-26 11:37 编辑: suiling 分类:iOS开发 来源:Vito Zhang'blog  11 4741 UIT ...

随机推荐

  1. ajax中的stasus错误详解

    一.英文版解析 0: (Uninitialized) the send( ) method has not yet been invoked. 1: (Loading) the send( ) met ...

  2. 浙大pat1013题解

    1013. Battle Over Cities (25) 时间限制 400 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue It ...

  3. Centos 下安装Zabbix Linux 客户端

    今天在linux上安装了客户端,过程如下: (1)下载zabbix客户端软件 wget www.zabbix.com/downloads/2.0.3/zabbix_agents_2.0.3.linux ...

  4. iOS 隐藏导航栏 隐藏状态栏

    1导航栏 self.navigationController.navigationBarHidden = YES; 2 状态栏 [[UIApplication sharedApplication] s ...

  5. 【Python之路】第九篇--Python基础之线程、进程和协程

    进程与线程之间的关系 线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除.线程可与属于同一进程的其它线程共享进程所拥有的全 ...

  6. 安装TensorFlow的步骤

    安装步骤: 1.安装虚拟机: 2.安装liunx系统: 3.安装TensorFlow. 1.安装虚拟机:虚拟机的版本是不能太低的.我使用的是:VMware-workstation-full-12.0. ...

  7. win10系统 L2TP连接尝试失败:ERROR因为安全层在初始化与远程计算机的协商时遇到了一个处理错误

    1 确保IPsec Policy Agent服务已启动 2 确保路由和远程访问(Routing and Remote Access)和远程访问连接管理器服务(Remote Access Connect ...

  8. linux安装包资源库

    最近发现了一个很不错的linux的rpm资源库,可以在里面找到rpm安装过程中缺失的资源! 网址:http://pkgs.org/

  9. 理解Load Average做好压力测试

    http://www.blogjava.net/cenwenchu/archive/2008/06/30/211712.html CPU时间片 为了提高程序执行效率,大家在很多应用中都采用了多线程模式 ...

  10. 神州数码品众_Android面试

    1.进程的定义,进程的调度: 2.线程的定义,多线程出错的描述: 3.数组和链表的定义和区别: 4.对链表的反序: 5.tree高度的计算: 6.设计一个存储系统,可以从客户端进行上传文件: 7.从长 ...