#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];
}