博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
KVO——下拉改变导航栏透明度
阅读量:5809 次
发布时间:2019-06-18

本文共 2497 字,大约阅读时间需要 8 分钟。

* 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
*)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

效果就是:

 

转载于:https://www.cnblogs.com/chengy134/p/5391541.html

你可能感兴趣的文章
spring-boot支持websocket
查看>>
菜鸟笔记(一) - Java常见的乱码问题
查看>>
我理想中的前端工作流
查看>>
记一次Git异常操作:将多个repository合并到同一repository的同一分支
查看>>
CodeIgniter 3.0 新手捣鼓源码(一) base_url()
查看>>
Chrome 广告屏蔽功能不影响浏览器性能
查看>>
vSphere 6将于2月2日全球同步发表
查看>>
Android状态栏实现沉浸式模式
查看>>
让你的APP实现即时聊天功能
查看>>
iOS 绝对路径和相对路径
查看>>
使用Openfiler搭建ISCSI网络存储
查看>>
应用新安全组 - 每天5分钟玩转 OpenStack(116)
查看>>
4.3. 键盘设置
查看>>
iOS - UIViewController
查看>>
IntPtr 转 string
查看>>
学生名单
查看>>
(转) 多模态机器翻译
查看>>
【官方文档】Nginx负载均衡学习笔记(三) TCP和UDP负载平衡官方参考文档
查看>>
矩阵常用归一化
查看>>
Oracle常用函数总结
查看>>