ios - 如何订阅更改图像

标签 ios swift rx-swift

我有自己的图像类(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/

相关文章:

ios - 如何对多个 NSProgress 使用 observeValueForKeyPath?

ios - 推送通知不会快速调用 didReceiveRemoteNotification

ios - 将事件传递到另一个 View

Swift 将 unsafemutablepointer<MyStruct> 快速转换为 C void 返回指针

macos - 使用 SWIFT 无法解析的标识符 'dispatch_get_main_queue'

swift - 仅在 rx_tap 事件上调用方法

ios - 如何允许编辑由 RxDataSources 支持的 TableView ?

ios - xcode apigee logInUserWithFacebook 额外参数?

ios - 快速保存变量

swift - 如何在 Reactive Extensions 中组合两个 observables 以便对结果进行分页?