我想观察UIViewframeboundscenter属性的变化.我如何使用键值观察来实现这一点?

推荐答案

通常存在不支持KVO的通知或其他可观察到的事件.尽管文件上说是'no',但从表面上看,CALayer支持UIView是安全的.观察CALayer在实践中是有效的,因为它广泛使用了KVO和适当的访问器(而不是ivar操作).这并不能保证它会在future 发挥作用.

无论如何,视图的框架只是其他属性的产物.因此,我们需要注意以下几点:

[self.view addObserver:self forKeyPath:@"frame" options:0 context:NULL];
[self.view.layer addObserver:self forKeyPath:@"bounds" options:0 context:NULL];
[self.view.layer addObserver:self forKeyPath:@"transform" options:0 context:NULL];
[self.view.layer addObserver:self forKeyPath:@"position" options:0 context:NULL];
[self.view.layer addObserver:self forKeyPath:@"zPosition" options:0 context:NULL];
[self.view.layer addObserver:self forKeyPath:@"anchorPoint" options:0 context:NULL];
[self.view.layer addObserver:self forKeyPath:@"anchorPointZ" options:0 context:NULL];
[self.view.layer addObserver:self forKeyPath:@"frame" options:0 context:NULL];

请参阅此处的完整示例 https://gist.github.com/hfossli/7234623

NOTE: This is not said to be supported in the docs, but it works as of today with all iOS versions this far (currently iOS 2 -> iOS 11)

注意:请注意,在最终值结算之前,您将收到多个回调.例如,更改视图或图层的边框将导致图层更改positionbounds(按该顺序).


使用ReactiveCocoa,您可以

RACSignal *signal = [RACSignal merge:@[
  RACObserve(view, frame),
  RACObserve(view, layer.bounds),
  RACObserve(view, layer.transform),
  RACObserve(view, layer.position),
  RACObserve(view, layer.zPosition),
  RACObserve(view, layer.anchorPoint),
  RACObserve(view, layer.anchorPointZ),
  RACObserve(view, layer.frame),
  ]];

[signal subscribeNext:^(id x) {
    NSLog(@"View probably changed its geometry");
}];

如果你只想知道什么时候能做bounds次改变

@weakify(view);
RACSignal *boundsChanged = [[signal map:^id(id value) {
    @strongify(view);
    return [NSValue valueWithCGRect:view.bounds];
}] distinctUntilChanged];

[boundsChanged subscribeNext:^(id ignore) {
    NSLog(@"View bounds changed its geometry");
}];

如果你只想知道什么时候能做frame次改变

@weakify(view);
RACSignal *frameChanged = [[signal map:^id(id value) {
    @strongify(view);
    return [NSValue valueWithCGRect:view.frame];
}] distinctUntilChanged];

[frameChanged subscribeNext:^(id ignore) {
    NSLog(@"View frame changed its geometry");
}];

Ios相关问答推荐

如何解释在SwiftUI视图中观察到持续的数据更改

UITableViewCell编程约束问题

如果没有等待,SWIFT Async让任务抛出取消异常

OnTapGesture在其修改的视图外部触发

如何删除NavigationView中的默认透明标头?

如何在expo-react native中从ios平台中排除包

如何在 SwiftUI 中通过通用 @ObservedObject 进行切换?

如何擦除 Swift 中的 Core Graphics Context 绘图?

使用 SceneKit 从 CapturedRoom.walls 重新创建 RoomPlan

叠加视图不在堆栈中维护自身 - SwiftUI

SwiftUI 解除 .alert 弹出 NavigationView

swiftUI中的剪辑形状无法使用旋转效果

访问未定义的 stage_in 金属着色器参数

如何在 OS X 或 iOS(不使用格式塔)中确定运行时的操作系统版本?

Xcode:此时无法安装此应用程序.

如何像在 Facebook 应用程序中一样以编程方式打开设置?

如何将自己项目中的类导入 Playground

UITableView:从空白部分隐藏标题

Objective-C 将 NSDate 设置为当前 UTC

zoom UIButton 动画 - Swift