読者です 読者をやめる 読者になる 読者になる

MvxImageViewの iOS / Android 間挙動差異について (追記:修正されました)

追記:本体で修正されています。(文末参照)

MvvmCross の iOS および Android 版には、画像のURLをバインディングするだけで表示してくれる便利クラスである MvxImageView が存在しています。ところが、iOS 版で UITableViewCell に MvxImageView を入れてバインディングしていると、スクロール中に他の行の画像が表示されることがかなりの頻度でありました。

そこで、検証コードを書いて、iOSAndroid で挙動を比較してみました。

まず、以下のような画像を取得するためのサービスを作りました。

何もセットしていない状態から、画像のURLをセットして、その後に別の画像のURLをセットした場合の動作を確認したのが下記のGIF画像。iOS のほうは2回目の画像が取得完了して表示されるまでは前の画像が、Android は空表示となります。

f:id:iseebi:20140504050223g:plain

次に、DefaultImagePath を指定した場合。DefaultImagePath は表示すべき画像がない場合に表示される画像のパスを指定します。画像のフルパス指定か、res: からはじまるリソースの名前を指定できます*1。この場合は同じ挙動を示します。

f:id:iseebi:20140504050234g:plain

iOS の場合は、UITableViewCell での残像問題を考えるとだいぶ辛い感じですが、ひとまず透過の1px画像をセットするなどで回避することはできそうです。

検証コードはこちらにありますので、気になる方は動かしてみてください。MvvmCross の中にはいっていけるよう、MvvmCross をソースで参照してあります。

MvvmCrossPlayground/MvxImageViewBindingSample at master · iseebi/MvvmCrossPlayground · GitHub

2014/05/09(Fri) 追記

MvvmCross に修正のプルリクエストを送りました。プルリクエスト初めてだったのでドキドキでしたが、取り込んでもらえました。

Stil display older image in MvxImageView (iOS) when loading and DefaultImagePath not present by iseebi · Pull Request #680 · MvvmCross/MvvmCross · GitHub

なので、このエントリに上がっている問題は次のバージョンで修正されると思います。

*1:iOSであれば、バンドルリソースのファイル名(.png を省略できないので注意が必要です)、AndroidであればdrawableのIDを指定します。