* KVO: key(鍵)-value(值)-observer(觀察者) 通過對一個對象、屬性或者變數值的觀察來做出對應的動作 只要key對應的值發生改變 就會告訴觀察者新舊值的變化 通過key來判斷是哪一個KVO 要實現KVO需要的條件: * 1.有觀察者、被觀察的對象 添加觀察者方法: 用誰去調 ...
* KVO: key(鍵)-value(值)-observer(觀察者)
通過對一個對象、屬性或者變數值的觀察來做出對應的動作
只要key對應的值發生改變 就會告訴觀察者新舊值的變化
通過key來判斷是哪一個KVO
要實現KVO需要的條件:
* 1.有觀察者、被觀察的對象
添加觀察者方法: 用誰去調用誰就是觀察者 給被觀察的對象添加一個觀察者
[被觀察的對象 addObserver:self forKeyPath:@"觀察的 屬性" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
* 2.只要值發生改變就去觸發 告訴觀察者值已經發生改變
只要觀察的值發生改變就會去調用
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
keyPath:觀察的哪一個屬性
Object:可以用於傳值
change:裡面是一個字典 包含發生改變的新值和舊值
* 3.不再需要觀察這個對象的時候移除觀察者 只要不移除就會崩潰 ***
[被觀察的對象 removeObserver:self forKeyPath:@"觀察的 屬性"];
我們在玩App的時候都看到過當你向下拉頁面的時候就會看到導航欄會慢慢消失,今天就以它為例介紹一下怎麼具體使用KVO
首先創建一個帶導航欄的視圖控制器
#import "AppDelegate.h" #import "ViewController.h" @interface AppDelegate () @end @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds]; self.window.rootViewController = [[UINavigationController alloc]initWithRootViewController:[[ViewController alloc]init]]; [self.window makeKeyAndVisible]; //設置導航欄的顏色 [UINavigationBar appearance].barTintColor = [UIColor colorWithRed:0.400 green:0.800 blue:1.000 alpha:1.000]; return YES; } @end
在ViewController.m文件裡面
#import "ViewController.h" @interface ViewController () { UIScrollView *myScrollView; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //創建滾動視圖 myScrollView = [[UIScrollView alloc]initWithFrame:self.view.frame]; myScrollView.backgroundColor = [UIColor whiteColor]; myScrollView.contentSize = CGSizeMake(0, 2000); [self.view addSubview:myScrollView]; //讓self觀察myScrollView裡面的contentOffset的值 是否發生改變 [myScrollView addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil]; } //只要值發生改變就去觸發,告訴觀察者值已經發生改變的方法 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{ NSLog(@"%@ %@",keyPath,change); CGPoint changPoint = [change[@"new"] CGPointValue]; CGFloat y = changPoint.y+64; NSLog(@"%f",1-y/100); self.navigationController.navigationBar.alpha = 1-y/100; } - (void)dealloc{ //移除觀察者 [myScrollView removeObserver:self forKeyPath:@"contentOffset"]; } @end
效果就是: