* KVO: key(键)-value(值)-observer(观察者)
通过对一个对象、属性或者变量值的观察来做出对应的动作
只要key对应的值发生改变 就会告诉观察者新旧值的变化
通过key来判断是哪一个KVO
要实现KVO需要的条件:
* 1.有观察者、被观察的对象
添加观察者方法: 用谁去调用谁就是观察者 给被观察的对象添加一个观察者
[被观察的对象 addObserver:self forKeyPath:@"观察的 属性" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
* 2.只要值发生改变就去触发 告诉观察者值已经发生改变
只要观察的值发生改变就会去调用
- (void)observeva lueForKeyPath:(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)observeva lueForKeyPath:(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
效果就是: