如何订阅更改图片
How to subscribe to changes image
我有自己的图片 class (UICustomImage)。
如何跟踪图片的变化并更新GLKView?
ViewModel:
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)
}
}
ViewController:
@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)
}
我希望图片在滑块移动时更新。
您需要将亮化后的图像导出为 Observable。如果您将 brightness(n:)
函数作为 UIImage 的扩展而不是自定义 class...
,这会简单得多
一些注意事项:
- ViewModels 不需要 处理包。如果你在你的视图模型中放置一个,你可能做错了什么。
- 我假设
UICustomImage
可以 return 通过调用 asImage
更新 UIImage
。
- 我假设
brightness(n:)
没有 return 值。
请注意我是如何让 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: [=10=])
return image.asImage
}
}
}
关于视图控制器的注释:
- 您忘记打电话给
super.viewDidLoad()
。你必须始终这样做。
- 我隐式解包了
image
。也可能因为代码在任何情况下都会在没有图像的情况下崩溃。
- 我将您的订阅转换为绑定。看起来更干净了。
将 viewModel 的图像 属性 设置为可观察对象后,您需要做的就是将其绑定到图像视图。
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)
}
}
我有自己的图片 class (UICustomImage)。
如何跟踪图片的变化并更新GLKView?
ViewModel:
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)
}
}
ViewController:
@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)
}
我希望图片在滑块移动时更新。
您需要将亮化后的图像导出为 Observable。如果您将 brightness(n:)
函数作为 UIImage 的扩展而不是自定义 class...
一些注意事项:
- ViewModels 不需要 处理包。如果你在你的视图模型中放置一个,你可能做错了什么。
- 我假设
UICustomImage
可以 return 通过调用asImage
更新UIImage
。 - 我假设
brightness(n:)
没有 return 值。
请注意我是如何让 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: [=10=])
return image.asImage
}
}
}
关于视图控制器的注释:
- 您忘记打电话给
super.viewDidLoad()
。你必须始终这样做。 - 我隐式解包了
image
。也可能因为代码在任何情况下都会在没有图像的情况下崩溃。 - 我将您的订阅转换为绑定。看起来更干净了。
将 viewModel 的图像 属性 设置为可观察对象后,您需要做的就是将其绑定到图像视图。
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)
}
}