3 回答
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];
}
}
}
TA贡献1813条经验 获得超2个赞
目前,无法使用KVO观察视图的帧。属性必须符合KVO才能被观察到。遗憾的是,与任何其他系统框架一样,UIKit框架的属性通常是不可观察的。
从文档:
注意:虽然UIKit框架的类通常不支持KVO,但您仍可以在应用程序的自定义对象中实现它,包括自定义视图。
此规则有一些例外,例如NSOperationQueue的operations
属性,但必须明确记录。
即使在视图的属性上使用KVO当前可能有效,我也不建议在运输代码中使用它。这是一种脆弱的方法,依赖于无证件的行为。
- 3 回答
- 0 关注
- 557 浏览
添加回答
举报