为啥 UIView 框架上的 observable 只在订阅后触发一次

Posted

技术标签:

【中文标题】为啥 UIView 框架上的 observable 只在订阅后触发一次【英文标题】:Why the observable on frame of UIView only trigger once after subscribing为什么 UIView 框架上的 observable 只在订阅后触发一次 【发布时间】:2018-08-29 14:05:57 【问题描述】:

我正在使用 RxSwift 来观察一个 UIView 的框架。这是我在视图中的代码

self.rx.observe(CGRect.self, #keyPath(UIView.frame))
    .subscribe(onNext:  frame in
        print("Got new frame \(frame)")
    )
    .debug()
    .disposed(by: disposeBag)

但是当我更改视图框架时它只打印一次并且不会运行第二次。有谁知道为什么会这样?提前致谢!

【问题讨论】:

其实不能,看看这个UIView frame/position binding 显然有一些无证的观察方式......如果你想危险地生活:KVO for a UIView frame 【参考方案1】:

这是旧帖子,但我分享我的代码。它工作正常。

   self.mapView
            .rx
            .observe(CGRect.self, #keyPath(UIView.frame))
            .asDriver(onErrorJustReturn: CGRect.zero)
            .drive(onNext:  (rect) in
                log.debug("Frame changed to \(String(describing: rect))")
            ).disposed(by: self.disposeBag)

在这里,我尝试使用 Driver 观察 mapView 的框架。

希望对您有所帮助。

【讨论】:

以上是关于为啥 UIView 框架上的 observable 只在订阅后触发一次的主要内容,如果未能解决你的问题,请参考以下文章

为啥 UIView 的扩展对除了放置在 IB 上的 UIView 之外的其他控件没有直接影响?

与嵌入式 UITableView 交互后,为啥我的 UIView 的框架会发生意外变化?

为啥在 Swift 中使用惰性 var 初始化时添加框架不显示 UIView

为啥UIView动画会改变View frame?

为啥这个自定义 UIView 代码不显示 UILabel 的?

我不知道为啥我必须在这个淘汰赛 observable 数组上调用 valueHasMutated