Xamarin FOrms iOS: ошибка CreateNativeControl ImageRenderer - PullRequest
0 голосов
/ 06 февраля 2020

Я пытаюсь реализовать пользовательский ImageRenderer в iOS, подклассифицируя собственный UIImageView, но у меня возникают некоторые проблемы с CreateNativeControl.

В более старой версии Xamarin.Forms (например, 4.2) пользовательский собственный класс то, что я инициализировал protected override UIImageView CreateNativeControl() { return new NativeImage(); }, выглядит так, как будто его никогда не вызывают (сообщение, которое я регистрирую в конструкторе, не отображается). Пользовательский рендерер правильно инициализирован (правильное сообщение записано в журнал).

В последней стабильной версии (например, 4.4) в переопределении CreateNativeControl возвращаемый тип, который называется FormsUIImageView, никогда о нем не слышал Во всяком случае, я также попытался создать подкласс этой, но такой же проблемы, как и раньше, кажется, что она никогда не вызывается, поскольку сообщение конструктора не записывается Custom Renderer правильно инициализирован (правильное сообщение записано).

Вот код, который я использовал:

public class IOSImageView : ImageRenderer
{
   public IOSImageView()
   {
   }

    protected override void OnElementChanged(ElementChangedEventArgs<Image> e)
    {
        base.OnElementChanged(e);

        if(Control == null)
        {
            return;
        }

        Console.WriteLine("PIPPO created from Custom Renderer");  //this message is correctly logged
    }


    protected override UIImageView CreateNativeControl()  //FormsUIImageView  in XF 4.4
    {
        return new NativeImage();
    }

}

public class NativeImage : UIImageView  //FormsUIImageView in XF 4.4
{
    public NativeImage() : base()
    {
        Console.WriteLine("PIPPO created from native IOS");  //this message is NOT logged
    }

    public override void TouchesBegan(NSSet touches, UIEvent evt)
    {
        base.TouchesBegan(touches, evt);
        Console.WriteLine("PIPPO touched");  //this (of course because no NativeImage is shown and there is no image to touch) is NOT logged
    }
}

1 Ответ

1 голос
/ 07 февраля 2020

FormsUIImageView является новым после XF 4.4, который вы можете проверить Xamarin.Forms заметки о выпуске

В вашем случае вы, похоже, хотите установить Image Renderer в качестве вашего пользовательский ImageView, верно?

Вы должны вызвать SetNativeControl()

protected override void OnElementChanged(ElementChangedEventArgs<Image> e)
{
   base.OnElementChanged(e);
   if(Control!=null)
   {
      SetNativeControl(new NativeImage());
   }
}

public class NativeImage : FormsUIImageView 
{
    public NativeImage() : base()
    {
         this.UserInteractionEnabled = true;
    }

    public override void TouchesBegan(NSSet touches, UIEvent evt)
    {
        base.TouchesBegan(touches, evt);
        Console.WriteLine("PIPPO touched");  //this (of course because no NativeImage is shown and there is no image to touch) is NOT logged
    }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...