使用RxSwift绑定两个UIview的frame/位置

6
我希望当 view1 的位置改变时,能够自动更改 view2 的位置,并使用 Rxswift 绑定两个视图的位置。我尝试使用以下方式观察视图框架/位置:
view.rx.observe(CGRect.self,"frame")
        .subscribe(onNext: {
            print($0 ?? (0,0))
        })

在初始化时,IT会打印出框架,但是当使用约束更改视图位置时,会发生变化。

self.constraintHorizontalCenterView.constant = 1000

如果代码没有打印任何内容,这意味着它没有观察到视图位置...

有没有一种方法可以持续观察视图位置或绑定视图位置?

3个回答

2

无论框架是否反映实际位置,您都可以像这样使用框架进行观察。

这是一篇旧文章,但我分享我的代码。它运行正确。

   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的框架。

希望这能对你有所帮助。


1

来自苹果的 'frame'

// 可动画化。如果视图被转换了,不要使用 frame,因为它将不能正确地反映视图的实际位置。改用 bounds + center。

您可以观察 bound 或 center 代替使用 frame。


-1

UIView.frame不符合KVO标准,因此您无法直接观察它。无论如何,在我看来这样做是不合适的。

某些事件导致您的视图大小发生变化。请观察该事件。


实际上,frame 是 KVO。 - d4Rk
1
UIKit中没有保证符合KVO。如果你发现将一个属性进行KVO可以使用,那么要感恩,因为这并不是旨在如此。同时也要小心,未来可能会出现问题。-- Dave DeLong。这句话来自他担任苹果公司传教士时的言论。他从2010年到2017年一直在苹果公司工作。 - Daniel T.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接