RxSwift:如何使用视图自动调整子层的大小';s正在调整大小

RxSwift:如何使用视图自动调整子层的大小';s正在调整大小,swift,rx-swift,Swift,Rx Swift,我正在学习RxSwift 我在TextField中添加了一个边框作为CALayer。我想在文本字段扩展时自动调整此边框的大小(inputView更改为pickerView,因此我希望可以通过选择标题来调整大小) 我尝试了.rx.observe(CGRect.self,“frame”),但它不能正常工作 扩展UITextField{ func addBorderBottom(高度:CGFloat,颜色:UIColor,宽度:CGFloat){ 让border=CALayer() border.fr

我正在学习RxSwift

我在TextField中添加了一个边框作为CALayer。我想在文本字段扩展时自动调整此边框的大小(inputView更改为pickerView,因此我希望可以通过选择标题来调整大小)

我尝试了
.rx.observe(CGRect.self,“frame”)
,但它不能正常工作

扩展UITextField{ func addBorderBottom(高度:CGFloat,颜色:UIColor,宽度:CGFloat){ 让border=CALayer() border.frame=CGRect(x:0,y:self.frame.height-高度,宽度:宽度,高度:高度) border.backgroundColor=color.cgColor self.layer.addSublayer(边框) } }
//viewcontroller
func listDetailUISetup(){
让yellowColor=UIColor.hex(字符串:“FFB500”,alpha:1)
tagTextField.addBorderBottom(高度:1.0,颜色:yellowColor,宽度:tagTextField.frame.width)
}
//
picker.rx.modelSelected(String.self)
.subscribe(onNext:{tags in
self.tagTextField.text=标记[0]
})
.处置(由:处置人)
tagTextField.rx.observe(CGRect.self,“帧”)
.subscribe(onNext:{frame in
打印(“字段帧已更改”)
让layer=self.tagTextField.layer.sublayers![0]
layer.frame=frame!
})
.处置(由:处置人)
在第二种方式中,我还尝试在选择pickerView中的标题时删除上一个边框后手动重新设置边框。但显然,上次选择的项目的宽度会被反映出来

初始宽度

全宽

收藏夹宽度

icker.rx.modelSelected(String.self)
.subscribe(onNext:{tags in
self.tagTextField.text=标记[0]
self.tagTextField.layer.sublayers=nil
self.listDetailUISetup()
})
.处置(由:处置人)
希望你能帮助解决这个问题


谢谢。

UIView上的
frame
属性不可观察KVO,因此您无法观察它。文本字段的
layoutSubviews
方法在更改大小时被调用,因此您可以使用它

extension UIView {
    func addDynamicBorderBottom(height: CGFloat, color: UIColor) -> Disposable {
        let border = CALayer()
        border.frame = CGRect(x: 0, y: frame.height - height, width: frame.width, height: height)
        border.backgroundColor = color.cgColor
        layer.addSublayer(border)

        return rx.methodInvoked(#selector(UIView.layoutSubviews))
            .bind(onNext: { [frame] _ in
                border.frame = CGRect(x: 0, y: frame.height - height, width: frame.width, height: height)
            })
    }
}


但最好将边框设置为UIView,并设置约束以确保其保持正确的大小。

UIView上的
frame
属性不可观察到KVO,因此无法观察它。文本字段的
layoutSubviews
方法在更改大小时被调用,因此您可以使用它

extension UIView {
    func addDynamicBorderBottom(height: CGFloat, color: UIColor) -> Disposable {
        let border = CALayer()
        border.frame = CGRect(x: 0, y: frame.height - height, width: frame.width, height: height)
        border.backgroundColor = color.cgColor
        layer.addSublayer(border)

        return rx.methodInvoked(#selector(UIView.layoutSubviews))
            .bind(onNext: { [frame] _ in
                border.frame = CGRect(x: 0, y: frame.height - height, width: frame.width, height: height)
            })
    }
}


但最好将边框设置为UIView并设置约束以确保其保持正确的大小。

但是在哪里调整
TextField
?我想调整添加到TextField子层的CALayer的大小:(但是在哪里调整
TextField
?我想调整添加到TextField子层的CALayer的大小:(感谢您的解决方案!我创建了一个边框作为UIView并设置了约束。处理CALayer对我来说非常困难。就您的解决方案而言,我不知道如何在我的代码中使用您的方法。返回一次性方式,是否考虑在
modelSelected之后追加。订阅
?感谢您的解决方案!我创建了一个border作为UIView并设置约束。CALayer的处理对我来说相当困难。就你的解决方案而言,我不知道如何在我的代码中使用你的方法。返回一次性方法,是否考虑在
modelSelected之后追加。订阅