2017-07-21 8 views
1

私は自分のイメージクラス(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) 
} 

私は絵が時にスライダーが移動し、更新することにしたいです。

+0

コードが正しいように見えます。それは働いていないのですか? – shpasta

+0

@shpastaこのコードは機能します。私は画像の変更を購読する方法を知らない。 – nik3212

+0

あなたのCustomImageクラスの中身はわかりませんが、image.rx.observe(Float.self、 "brightness")などのKVOでそのプロパティを見ることができます。subscribe(onNext:{brightness in ...} )、brightnessがCustomImageクラスのFloatプロパティである場合 – shpasta

答えて

2

明るくされた画像をObservableとして書き出す必要があります。

  • のviewmodelsがは袋を処分する必要はありませんん:カスタムクラスを作るのではなく、UIImageにごbrightness(n:)機能拡張を行った場合、これは...

    いくつかの注意はるかに簡単になります。あなたのビューモデルに1つ入れているなら、おそらく何か間違っているでしょう。

  • 私はUICustomImageasImageに電話して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 
      } 
    } 
} 

注:

  • あなたはsuper.viewDidLoad()に電話をするのを忘れました。あなたはいつもそうしなければなりません。
  • imageを暗黙のうちにアンラップしました。いずれにしても、コードがイメージなしでクラッシュしてしまった可能性があります。
  • あなたの購読をバインドに変換しました。それはよりきれいに見える。

viewModelのイメージプロパティをobservableにしたら、それをイメージビューにバインドするだけです。

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) 
    } 
} 
関連する問題