iOS UITextView 根據輸入text自適應高度

 

#import "ViewController.h"瀏覽器

  

@interface ViewController ()<UITextViewDelegate>網絡

 

// KVO和動態自適應尺寸app

@property (nonatomic, strong)UITextView *txtView;測試

// KVO測試字體

@property (nonatomic, strong)Person *person;atom

@end加密

 

@implementation ViewController代理

 

- (void)viewDidLoad指針

{orm

    [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];

}

相關文章
相關標籤/搜索