我有自己的图像类(UICustomImage)。
如何跟踪图片变化并更新GLKView?
View 模型:
final class ViewModel {
private let disposeBag = DisposeBag()
let image: UICustomImage
let sliderValue: Variable<Float>
init(image: UIImage) {
self.sliderValue = Variable(Float(0.0))
self.image = UICustomImage(image: image)
self.sliderValue.asObservable()
.subscribe(onNext: { (value) in
self.image.brightness(n: value)
})
.disposed(by: disposeBag)
}
}
View Controller :
@IBOutlet var slider: UISlider!
private let disposeBag = DisposeBag()
private var viewModel: ViewModel!
var image: UIImage?
override viewDidLoad() {
viewModel = ViewModel(image: image!)
slider.rx.value
.subscribe(onNext: { value in
self.viewModel.sliderValue.value = value
})
.disposed(by: disposeBag)
}
我希望图片在 slider 移动时更新。
最佳答案
您需要将明亮的图像导出为可观察对象。如果您将 brightness(n:)
函数作为 UIImage 的扩展而不是创建自定义类,这会简单得多...
一些注意事项:
- ViewModel不需要需要处理袋子。如果您将其放入 View 模型中,则可能做错了什么。
- 我假设
UICustomImage
可以通过调用asImage
返回更新的UIImage
。 - 我假设
brightness(n:)
没有返回值。
请注意我如何将 image
设为 sliderValue
上的因变量。
final class ViewModel {
let image: Observable<UIImage>
let sliderValue: Variable<Float>
init(image: UIImage) {
sliderValue = Variable(Float(0.0))
self.image = sliderValue.asObservable()
.map { let image = UICustomImage(image: image)
image.brightness(n: $0)
return image.asImage
}
}
}
关于 View Controller 的注释:
- 您忘记调用
super.viewDidLoad()
。你必须始终这样做。 - 我隐式地展开了
image
。也可能是因为在任何情况下如果没有图像代码都会崩溃。 - 我将您的订阅转换为绑定(bind)。看起来更干净。
一旦您将 viewModel 的图像属性设置为可观察的,那么您所需要做的就是将其绑定(bind)到您的 ImageView 。
final class ViewController: UIViewController {
@IBOutlet weak var slider: UISlider!
@IBOutlet weak var imageView: UIImageView!
private let disposeBag = DisposeBag()
private var viewModel: ViewModel!
var image: UIImage!
override func viewDidLoad() {
super.viewDidLoad()
viewModel = ViewModel(image: image)
slider.rx.value
.bind(to: viewModel.sliderValue)
.disposed(by: disposeBag)
viewModel.image
.bind(to: imageView.rx.image)
.disposed(by: disposeBag)
}
}
关于ios - 如何订阅更改图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45238676/