为了账号安全,请及时绑定邮箱和手机立即绑定

如何在UIView的帧上进行键值观察并获得KVO回调?

如何在UIView的帧上进行键值观察并获得KVO回调?

温温酱 2019-09-20 16:39:14
我想看了在变化UIView的frame,bounds或center财产。我如何使用Key-Value Observing来实现这一目标?
查看完整描述

3 回答

?
德玛西亚99

TA贡献1770条经验 获得超3个赞

我不认为这个解决方案足够彻底。这个答案是出于历史原因而保留的。


你必须在frame-property上做KVO。在这种情况下,“self”是一个UIViewController。


添加观察者(通常在viewDidLoad中完成):


[self addObserver:self forKeyPath:@"view.frame" options:NSKeyValueObservingOptionOld context:NULL];

删除观察者(通常在dealloc或viewDidDisappear :)中完成:


[self removeObserver:self forKeyPath:@"view.frame"];

获取有关更改的信息


- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {

    if([keyPath isEqualToString:@"view.frame"]) {

        CGRect oldFrame = CGRectNull;

        CGRect newFrame = CGRectNull;

        if([change objectForKey:@"old"] != [NSNull null]) {

            oldFrame = [[change objectForKey:@"old"] CGRectValue];

        }

        if([object valueForKeyPath:keyPath] != [NSNull null]) {

            newFrame = [[object valueForKeyPath:keyPath] CGRectValue];

        }

    }

}


查看完整回答
反对 回复 2019-09-20
?
慕姐8265434

TA贡献1813条经验 获得超2个赞

目前,无法使用KVO观察视图的帧。属性必须符合KVO才能被观察到。遗憾的是,与任何其他系统框架一样,UIKit框架的属性通常是不可观察的。

从文档:

注意:虽然UIKit框架的类通常不支持KVO,但您仍可以在应用程序的自定义对象中实现它,包括自定义视图。

此规则有一些例外,例如NSOperationQueue的operations属性,但必须明确记录。

即使在视图的属性上使用KVO当前可能有效,我也不建议在运输代码中使用它。这是一种脆弱的方法,依赖于无证件的行为。


查看完整回答
反对 回复 2019-09-20
  • 3 回答
  • 0 关注
  • 557 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信