首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

观察派生属性的变化:CALayer KVO示例

观察派生属性的变化:CALayer KVO示例

CALayer是一个用于处理图层的核心动画框架,它提供了许多属性,例如位置、大小、透明度等。有时候,我们需要观察这些属性的变化,并在属性变化时执行某些操作。KVO(Key-Value Observing)是一种观察属性变化的机制,可以用于观察CALayer的派生属性。

以下是一个简单的CALayer KVO示例:

代码语言:swift
复制
class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let layer = CALayer()
        layer.frame = CGRect(x: 0, y: 0, width: 100, height: 100)
        layer.backgroundColor = UIColor.red.cgColor
        view.layer.addSublayer(layer)
        
        layer.addObserver(self, forKeyPath: "bounds", options: .new, context: nil)
    }
    
    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        if keyPath == "bounds" {
            print("Layer bounds changed: \(change?[.newKey])")
        }
    }
}

在这个示例中,我们创建了一个CALayer,并将其添加到视图层中。然后,我们使用addObserver方法观察该层的bounds属性。当bounds属性发生变化时,observeValue方法将被调用,我们可以在该方法中执行我们需要的操作。

需要注意的是,在使用KVO观察属性时,必须在适当的时机注销观察者,以避免内存泄漏。在本示例中,我们没有显式注销观察者,因为它在deinit方法中自动注销。但是,在实际应用中,如果需要长时间观察属性,则必须在适当的时机注销观察者。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

OC观察者模式之KVO使用与思考

,比如tableview中数据发生变化进行刷新列表操作,监听 scrollViewcontentOffset属性监听页面的滑动. 2.KVO使用方法 KVO使用可分为自动监听和手动监听。...1.自动监听 1.1自动监听操作步骤: (1)添加观察者 (2)在观察者中添加观察键值方法 (3)在dealloc中移除监听 1.2示例代码: 创建两个类ModelA和ModelB,两个类中都添加属性“...并且将原型对象isa指针指向该派生类。同时在派生类中重载了使用KVO属性setter方法,在重载setter方法中实现真正通知机制,正如前面我们手动实现KVO一样。...而KVO如我们介绍,设置观察者->处理属性变化,至于中间通知这一环,则隐秘多了,只留一句“交由系统通知”,具体可参照以上实现过程剖析。...3、被观察者销毁时还存在观察者(iOS11以上不会崩溃) 这种情况常出现在复杂逻辑下,观察者先于被观察者销毁[9] 4、KVO 行为是同步,并且发生与所观察值发生变化同样线程上。

1.4K30

编码篇-KVO使用大全

简单说就是每次指定观察对象属性被修改后,KVO就会自动通知相应观察者了。...当某个类属性对象第一次被观察时,系统就会在运行期间动态地创建该类一个派生类,在这个派生类中重写基类任何被观察属性setter方法。派生类在被重写setter方法内实现真正通知机制。...我们知道,每一个类中都有一个isa指针指向当前类,所有系统就是在当一个类对象第一次被观察时候,系统就会偷偷将isa指针指向动态生成派生类,从而在被监听属性赋值时被执行派生setter方法。...补充:KVO这套实现机制中苹果还偷偷重写了class方法,让我们误认为还是使用的当前类,从而达到隐藏生成派生类。 ? KVO优点: 当 有属性改变,KVO会提供自动消息通知。...其次,KVO架构非常强大,可以很容易支持多个观察观察同一个属性,以及相关值。

60320

【IOS开发基础系列】KVOKVC专题

runtime运行时,下面就来详细介绍一下原理:     • 当某个类对象第一次被观察时,系统就会在运行期动态地创建该类一个派生类,在这个派生类中重写基类中任何被观察属性setter 方法。...• 派生类在被重写setter 方法中实现真正通知机制,就如前面手动实现键值观察那样。这么做是基于设置属性会调用setter 方法,而通过重写就获得了KVO 需要通知机制。...当然前提是要通过遵循KVO 属性设置方式来变更属性值,如果仅是直接修改属性对应成员变量,是无法实现KVO 。    ...然后系统将这个对象isa 指针指向这个新诞生派生类,因此这个对象就成为该派生对象了,因而在该对象上对setter 调用就会调用重写setter,从而激活键值通知机制。...2开发技巧 2.1 常见问题 2.1.1 kvo通知没有发出来问题 KVO通知发起机制:        KVO属性变化后,通知发出是在属性setter方法中发起,所以属性赋值时,一定要用.操作符或者用方法调用

20520

OC底层探索20-KVOisa-swizzling分析OC底层探索20-KVOisa-swizzling分析

1、 KVO是什么? KVO 全称Key Value Observing,是苹果提供一套事件通知机制。允许对象监听另一个对象特定属性改变,并在改变时接收到事件。...由于 KVO 实现机制,属性变化还有通过kvc进行修改,一般继承自 NSObject 对象都默认支持 KVOKVO 可以监听单个属性变化,也可以监听集合对象变化。...会发现在addObserver之后,类Isa指向发生了变化 3.1.1 NSKVONotifying_XXX 中间派生类 猜测NSKVONotifying_LGPerson这个类是系统动态进行添加,所以需要分析它进行关系...总结 在addObserver之后: 系统动态创建了中间派生类NSKVONotifying_xxx 1.1 在派生类中重写了set,delloc方法,并创建新方法class,_isKVOA; 将被观察类...(LGPerson)isa指向新建中间派生类NSKVONotifying_xxx; 在被观察者发生变化: 调用了set方法中NSKeyValueWillChange; 调用了LGPerson原生类中

58620

透彻理解 KVO 观察者模式(附基于runtime实现代码)

observer参数是回调接收者。 keyPath是一个寻找路径,最终落脚点是一个有效观察属性。...,NSKeyValueObservingOptionPrior表示在被观察属性变化前后都回调一次。...二、KVO 基本原理 苹果官方对 KVO 讲解很少,很多大牛对 KVO 做了深入探究,比如 Mike Ash 一篇博客 大致原理描述: KVO 是基于 runtime 运行时来实现,当你观察了某个对象属性...,内部会生成一个该对象所属类子类,然后从写被观察属性setter方法,当然在重写方法中会调用父类setter方法从而不会影响框架使用者逻辑,之后会将该对象isa指针指向新创建这个类,最后会重写...同时,我们还观察了setAName:方法地址,发现同样是有变化,同样验证了重写setter方法逻辑。

98380

KVO编程指南

要使用KVO,首先必须确保所观察对象(本例中Account)符合KVO标准。 通常情况下,如果您对象继承自NSObject,并且以常规方式创建属性,那么您对象及其属性将自动成为KVO兼容。...下面显示了以这种方式选择balance和interestRate属性示例context。...KVO支持与KVC相同数据类型,包括Objective-C对象以及标量和结构支持中列出标量和结构。 该类发出该属性KVO变化通知。...如果一个属性值发生变化,那么派生属性值也应该被标记为变化。 如何确保为这些相关属性发布键值观察通知取决于关系基数。...多对多关系 您可以使用键值观察将所有子项(在此示例中为employees)相关属性注册母项(在本例中为Department)注册为观察者。

85620

程序员面试时这样介绍自己项目经验,成功率能达到98.99%

基本原理: 1.KVO是基于runtime机制实现 2.当某个类属性对象第一次被观察时,系统就会在运行期动态地创建该类一个派生类,在这个派生类中重写基类中任何被观察属性setter 方法。...,那么系统会偷偷将isa指针指向动态生成派生类,从而在给被监控属性赋值时执行派生setter方法 5.键值观察通知依赖于NSObject 两个方法: willChangeValueForKey...当观察对象A时,KVO机制动态创建一个新名为: NSKVONotifying_A新类,该类继承自对象A本类,且KVO为NSKVONotifying_A重写观察属性setter 方法,setter...2.NSKVONotifying_A类剖析:在这个过程,被观察对象 isa 指针从指向原来A类,被KVO机制修改为指向系统新创建子类 NSKVONotifying_A类,来实现当前类属性值改变监听...且重写观察属性setter 方法这种继承方式注入是在运行时而不是编译时实现KVO原理图 2.说说你理解埋点? 3.消息转发机制原理?

96610

函数响应式编程及ReactiveObjC学习笔记 (二)

官方是这样说, RAC为我们提供了简单便捷实现代理 / block回调 / 事件 / 通知 / KVO方式 我们先看RAC如何帮助我们快速实现KVO 首先我们新建一个Student类, 给它一个age...属性 #import @interface Student : NSObject @property (nonatomic, strong) NSString...*age; @end 下面我们看一个简单的如何使用RAC来实现KVO Student *stu = [[Student alloc] init]; // RAC KVO...) 2017-07-23 11:35:19.704 RAC[67362:13075201] stuage改变为: 10 很方便对吧, 不用我们去add observe, 不用出来观察事件, 也不用我们去移除关注...这里其实RAC还为我们提供了除了subscriber以外操作, 后面再介绍给, 现在我们主要先来看RAC是怎么替我们做KVO 我们再看看RAC如何帮我们实现target-action 我们创建一个项目

46811

iOS - 关于 KVO 一些总结

当被观察对象属性值发生改变时,会触发KVO监听方法来通知观察者。KVO是在MVC应用程序中各层之间进行通信一种特别有用技术。...KVO和NSNotification都是iOS中观察者模式一种实现。 KVO可以监听单个属性变化,也可以监听集合对象变化。...如图所示: [u0enpleo8b.png] 斯坦福大学 KVO示例 2.6 KVO触发监听方法方式 KVO触发分为自动触发和手动触发两种方式。...3.3 KVO 监听集合对象 KVO可以监听单个属性变化,也可以监听集合对象变化。...(注意:如果直接对集合对象进行操作改变,不会触发KVO。) 示例代码及输出如下: 观察者 viewController 对被观察对象 person mArray 属性进行监听。

2.5K21

KVCKVO 本质

KVO 实现原理 KVO是关于runtime机制实现 当某个类对象属性第一次被观察时,系统就会在运行期动态地创建该类一个派生类,在这个派生类中重写基类中任何被观察属性setter方法。...派生类在被重写setter方法内实现真正通知机制 如果原类为Person,那么生成派生类名为NSKVONotifying_Person 每个类对象中都有一个isa指针指向当前类,当一个类对象第一次被观察...,那么系统就会偷偷讲isa指针指向动态生成派生类,从而在给被监控属性复制是执行派生setter方法 键值观察通知依赖于NSObject两个方法:willChangeValueForKey:和...didChangeValueForKey:,在一个被观察属性发生改变之前,willChangeValueForkey:和didChangeValueForKey:;在一个被观察属性发生改变之前,willChangeValueForKey...补充 KVC提供属性值正确性验证API,它可以用来检查set值是否正确、为不正确值做一个替换值或者拒绝设置新值并返回错误原因。

59240

iOS面试题梳理(二)

KeyPath、KVC、KVO 键路径(KeyPath): 1.在一个给定实体中,同一个属性所有值具有相同数据类型。 2.键-值编码技术用于进行这样查找,它是一种间接访问对象属性机制。...因为使用 KVC 键值编码,它必须先解析字符串,然后在设置或者访问对象实例变量。 键值观察(KVO): 1.键值观察机制是一种能使得对象获取到其他对象属性变化通知 ,极大简化了代码。...2.实现 KVO 键值观察模式,被观察对象必须使用 KVC 键值编码来修改它实例变量,这样才能被观察观察到。...KVO只检测类中属性,并且属性名都是通过NSString来查找,编译器不会检错和补全,全部取决于自己。...Core Data功能 1.对于KVC和KVO完整且自动化支持,除了为属性整合KVO和KVC访问方法外,还整合了适当集合访问方法来处理多值关系; 2.自动验证属性(property)值; 3.支持跟踪修改和撤销操作

1.2K101

iOS键值观察KVO实例详解简介实例效果实现方式进阶用法

现在我们给这个实例化了学生模型添加一个观察者,定义为我要观察学生模型分数变化情况,这时,如果这个学生模型分数发生了变化,比如在按钮响应中只对模型分数属性进行修改,KVO这个机制就会自动给观察者发送通知...于是我们在观察KVO回调函数中进行相应操作,如果我们收到了分数变化通知,那么就将分数label值给修改为当前分数。...这样就实现了一套KVO键值观察流程,当然最后还缺一步就是移除观察者,不过要在确实需要移除时候再移除,因为移除后就不再会收到变化通知了。...实现方式 上面例子中进行了一套KVO键值观察流程,我们整理一下进行了哪些工作: 设计界面样式 建立学生模型 对学生分数属性添加观察 修改学生分数属性观察变化响应方法中进行界面更新操作 不再需要观察时候移除观察...联想到KVO名字,键值观察,就能大概明白了,学生模型属性名就相当于key,属性值就相当于值。

33930

AVKit框架详细解析(四) —— 基于AVKit 和 AVFoundation框架视频流App构建

这个 CALayer 子类就像任何其他层:它显示其contents属性任何内容。 该层恰好用您通过其player属性提供视频中帧填充其内容。...当谈到“跟踪”播放器信息时,唯一途径就是使用键值观察KVO)。 是的,这是 Apple 提出最奇怪 API 之一。 如果你小心,它是一种实时观察和响应状态变化强大方法。...如果你完全不熟悉 KVO,这里有一个简单解释:基本思想是你在特定属性值发生变化时注册通知。 在这种情况下,您想知道播放器 currentItem 何时发生变化。...要在 Swift 中使用 KVO——比在 Objective-C 中好得多——你需要保留对观察引用。...要开始观察属性,请将以下内容添加到 init(urls:) 末尾: token = player?.

6.9K10

KVO详解(一)

KVO初探 KVO三部曲 我们知道,实现一个KVO有三个步骤:添加观察者、响应观察变化、移除观察者。 我们先来看看如何添加一个观察者。..."name"变化是student中name属性变化还是person中name属性变化呢?...我在A、B页面都通过KVO监听了student单例对象name属性变化,然后分别进行了响应。...现在我从A页面跳转到B页面,此时student单例对象name属性变化就有A和B两个观察者了,然后我返回A,但是在Bdealloc中并没有移除KVO观察。...返回到A页面后,针对student单例对象name属性变化,仍旧有A和B两个观察者,然后我在A页面改变了student单例对象name属性值,此时在A页面的观察和响应都没有问题,但是此时观察者B

72831

神奇Runtime

2、KVO 当某个类对象第一次被观察时,系统就会在运行期动态地创建该类一个派生类,在这个派生类中重写基类中任何被观察属性 setter 方法。...派生类在被重写 setter 方法实现真正通知机制,就如前面手动实现键值观察那样。这么做是基于设置属性会调用 setter 方法,而通过重写就获得了 KVO 需要通知机制。...当然前提是要通过遵循 KVO 属性设置方式来变更属性值,如果仅是直接修改属性对应成员变量,是无法实现 KVO 。 同时派生类还重写了 class 方法以“欺骗”外部调用者它就是起初那个类。...然后系统将这个对象 isa 指针指向这个新诞生派生类,因此这个对象就成为该派生对象了,因而在该对象上对 setter 调用就会调用重写 setter,从而激活键值通知机制。...简单而言:在被观察时,生成派生类,对于观察属性重写setter方法,然后在valuewillchange方法和valuesdidchanged方法里发出通知 1、当一个object有观察者时,动态创建这个

59920

ios KVO及实现原理

由于KVO实现机制,所以对属性才会发生作用,一般继承自NSObject对象都默认支持KVOKVO和NSNotificationCenter都是iOS中观察者模式一种实现。...区别在于,相对于被观察者和观察者之间关系,KVO是一对一,而不一对多KVO对被监听对象无侵入性,不需要修改其内部代码即可实现监听。 KVO可以监听单个属性变化,也可以监听集合对象变化。...基础使用 使用KVO分为三个步骤: 1.注册观察者,指定被观察对象属性 [person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew...Person时,KVO机制动态创建一个新名为: NSKVONotifying_Person新类,该类继承自对象Person本类,且KVO为NSKVONotifying_Person重写观察属性setter...类,来实现当前类属性值改变监听; 子类setter方法剖析 KVO键值观察通知依赖于 NSObject 两个方法:willChangeValueForKey:和 didChangevlueForKey

65620

图层树和寄宿图 -- iOS Core Animation 系列一

视图在层级关系中可以互相嵌套,一个视图可以管理它所有子视图位置。 在iOS中,所有的视图都是从UIView这个基类派生出来。...contents属性 CALayer有一个属性叫做contents,这个属性是id类型,可以是任何类型对象。...但是如果把contentsGravity设置成kCAGravityCenter(这个值不会拉伸图片),变化见下图: ? 如图所示,图片会变有点大,而且有像素颗粒感。...UIView有个clipsToBounds属性来决定是否显示超出边界内容。CALayer对应属性叫做maskToBounds,把它设置成YES就可以不显示超出部分图片了。...CALayer有一个可选delegate属性,当CALayer需要内容时候,会从这个delegate里面查询。

1.2K20

KVO 正确使用姿势进阶及底层实现你要知道KVC、KVO、Delegate、Notification都在这里

、Notification 区别及相关使用场景 KVO 正确使用姿势进阶及底层实现 KVO(key value observing)键值监听是我们在开发中常使用用于监听特定对象属性变化方法,常用于监听数据模型变化从而可以动态修改对应视图...keyPath即为监听属性路径 object为被监听对象 change保存被监听值产生变化 context为监听上下文,由add方法回传 */ - (void)observeValueForKeyPath...KVO在注册监听器时候不会持有监听器对象引用,也不会像weak那样在监听器对象被销毁时置nil,而是仅仅保留监听器对象地址,类似于copy修饰符,当监听器对象被销毁而又没有删除监听器时,如果这个时候被监听对象值发生变化系统会执行监听器回调函数...技术以及观察者模式。...当对一个对象属性第一次进行监听器注册后,编译器会默认生成一个名称为NSKVONotifying_原有类名称派生中间类,该类继承原有类,然后修改原有类对象isa指针,使其指向新生成中间类,接着,会在派生类中修改监听属性

1.5K80

KVO详解(二)

我现在想看一下当被KVO观测属性值改变时候,原来setter方法里面做了哪些事情: ? 然后我在调试框中使用watchpoint来观测_name变化: ?...在OC中,函数式编程可以通过Block来体现,因此,我们可以通过Block形式将KVO添加观察者和响应变化合二为一。 响应变化Block定义放在KVO信息模型中: ?...在添加KVO观察时候传一个handleBlock进来,然后将其保存在KVO信息Model中: ? ? 在对应属性值发生变化时候,回调该handle: ?...这样一改造之后,在外界使用时候,KVO观察添加和KVO变化监听就可以一起写了,而不必分开写了: ? 一个循环引用小问题 接下来说一个小点: ?...为了避免循环引用,那么就打断其中一条腿,所以在保存KVO信息模型中,关于观察者observer属性声明使用是weak关键字。

68331

iOS KVO实现原理及使用

关于KVO实现,文章已经很多了,这里阐述我个人观点,写一些自己感受 1、简介 KVO(key-value observe)是在KVC基础上实现一种用于监听属性变化设计模式;如果对某个类某个属性设置了...KVO,那么当这个属性发生变化时,就会触发监听方法,从而知道属性变化了。...如果本类一个属性改变会影响到其他多个属性变化,我们也会经常自己重写这个属性set方法,用来监听他变化,但是如果不是本类属性,我们就没办法重写其set方法了,这个时候KVO就可以上场了,其实KVO...会根据注册时option返回不同字典 上面我们提到了KVO是建立在KVC基础上,可以看到,如果不通过KVC改变属性,那么set方法就不会执行,那么KVO也就没办法监听属性变化了。...当观察对象时,KVO机制动态创建一个新名为:NSKVONotifying_对象名 新类,该类继承自目标对象本类,且 KVO 为 NSKVONotifying_对象名 重写观察属性 set 方法。

47420
领券