Skip to content

Instantly share code, notes, and snippets.

@matsukurou
Last active August 29, 2015 14:24
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save matsukurou/5a0d561ec56f849bfe79 to your computer and use it in GitHub Desktop.
Save matsukurou/5a0d561ec56f849bfe79 to your computer and use it in GitHub Desktop.
Xamarin.FormsでImageをカスタマイズする(カスタムレンダラー、iOS)
using System;
using Xamarin.Forms;
// CustomImageのレンダラーをCustomImageRendererに変更する宣言
[assembly:ExportRenderer(typeof(CustomImage.CustomImage), typeof(CustomImage.iOS.CustomImageRenderer))]
namespace CustomImage.iOS
{
/// <summary>
/// Imageに対応した、ImageRendererを継承したクラスをカスタムレンダラークラスとして作成
/// </summary>
public class CustomImageRenderer : Xamarin.Forms.Platform.iOS.ImageRenderer
{
/// <summary>
/// 初期設定されたときに呼ばれる
/// </summary>
/// <param name="e">E.</param>
protected override void OnElementChanged(ElementChangedEventArgs<Image> e)
{
base.OnElementChanged(e);
}
/// <summary>
/// プロパティの変更があった場合に呼び出される
/// </summary>
/// <param name="sender">Sender.</param>
/// <param name="e">E.</param>
protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
// ElementをキャストしてFormsで定義したカスタム用のImageを取得
var formsImage = (CustomImage)Element;
// 透明色が設定されていた場合は以降の処理をしない
// カラー設定されていないものの、意図しない塗りつぶしを防ぐため
if (formsImage.ImageColor == Color.Transparent)
return;
// iOS用のイメージを取得
var image = Control.Image;
if (image != null && image.RenderingMode != UIImageRenderingMode.AlwaysTemplate)
{
// 色変更できるモードでUIImageを生成する
// こうしないと色変更できない
// 変更するのはAlpha値のみを見ている,0以外は塗りつぶし
var img = image.ImageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate);
// UIImageViewに生成したUIImageを設定する
Control.Image = img;
// 画像のカラーをプロパティに設定したものに変更
Control.TintColor = formsImage.ImageColor.ToUIColor();
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment