Metode menggambar tidak dipanggil dari UIView khusus

Saya membuat pin peta khusus (anotasi) untuk iOS, menggambar jalurnya dan kemudian mengonversi UIView menjadi gambar, menggunakan metode:

public static UIImage AsImage(this UIView view)
{
    try
    {
        UIGraphics.BeginImageContextWithOptions(view.Bounds.Size, true, 0);
        var ctx = UIGraphics.GetCurrentContext();
        view.Layer.RenderInContext(ctx);
        var img = UIGraphics.GetImageFromCurrentImageContext();
        UIGraphics.EndImageContext();
        return img;
    }
    catch (Exception)
    {
        return null;
    }
}

dan ini adalah kelas turunan UIView, tempat saya menggambar jalur anotasi:

public class PinView : UIView
{
    public PinView()
    {
        ContentMode = UIViewContentMode.Redraw;
        SetNeedsDisplay();
    }
    private readonly CGPoint[] markerPathPoints = new[]
   {
        new CGPoint(25f, 5f),
        new CGPoint(125f, 5f),
        //other points    };

    public override void Draw(CGRect rect)
    {
        base.Draw(rect);
        //get graphics context
        CGContext context = UIGraphics.GetCurrentContext();
        //set up drawing attributes
        context.SetLineWidth(10);
        UIColor.White.SetFill();
        UIColor.Black.SetStroke();

        //create geometry
        var path = new CGPath();
        path.MoveToPoint(markerPathPoints[0].X, markerPathPoints[0].Y);
        for (var i = 1; i < markerPathPoints.Length; i++)
        {
            path.AddLineToPoint(markerPathPoints[i].X, markerPathPoints[i].Y);
        }

        path.CloseSubpath();
        //add geometry to graphics context and draw it
        context.AddPath(path);
        context.DrawPath(CGPathDrawingMode.FillStroke);
    }

Saya sedang memodifikasi Xamarin.Forms contoh MapCustomRenderer, alih-alih memuat anotasi dari file, saya memuatnya dari tampilan:

annotationView.Image = new PinView().AsImage();

tapi PinView.Draw() tidak pernah dipanggil!


person mshwf    schedule 23.12.2019    source sumber


Jawaban (2)


Metode Draw akan dipanggil setelah metode ViewDidLoadsaat kontrol pertama kali dimuat, yang dipanggil secara otomatis oleh sistem.

Dalam kasus Anda, Anda tidak menyetel Rect(Frame) dari PinView . Jadi metode Draw tidak akan pernah dipanggil karena Rect defaultnya adalah nol.

Jadi Anda bisa mengatur bingkai default di konstruktor

public PinView()
{
  Frame = new CGRect (0,0,xx,xxx);
  ContentMode = UIViewContentMode.Redraw;
  SetNeedsDisplay();
}
person Lucas Zhang    schedule 23.12.2019
comment
Tahu kenapa tampilannya muncul sebagai kotak hitam? tidak ada warna hitam yang ditentukan, dan tampilan berfungsi dengan baik saat meneruskan ke SetNativeControl dari penyaji kontrol khusus - person mshwf; 23.12.2019
comment
Anda dapat memberikan contoh yang berisi masalah tersebut sehingga saya dapat mengujinya di pihak saya. - person Lucas Zhang; 23.12.2019
comment
Saya pikir karena UIColor.Black.SetStroke(); - person Lucas Zhang; 23.12.2019
comment
dalam contoh terlampir seharusnya UIColor.Blue.SetStroke(); - person mshwf; 23.12.2019
comment
Saya pikir Draw masih belum dipanggil :( - person mshwf; 23.12.2019

Tampilan perlu ditambahkan ke hierarki tampilan, dalam kasus saya, ke MKAnnotationView, jadi di konstruktor CustomMKAnnotationView:

public CustomMKAnnotationView(IMKAnnotation annotation, string id)
    : base(annotation, id)
{
    var pin = new PinView(new CGRect(0, 0, 110, 110));
    pin.BackgroundColor = UIColor.White.ColorWithAlpha(0);
    Add(pin);
}

dan di konstruktor UIView, Frame harus diinisialisasi seperti yang dinyatakan Lucas Zhang:

public PinView(CGRect rectangle)
{
    Frame = rectangle;
    ContentMode = UIViewContentMode.Redraw;
    SetNeedsDisplay();
}

Dengan perubahan ini metode Draw dipanggil.

person mshwf    schedule 23.12.2019
comment
Jangan lupa menerima jawabannya, yang akan membantu lebih banyak orang :) - person Lucas Zhang; 23.12.2019
comment
Anda dapat mengedit jawaban Anda dengan lebih detail atau mengedit jawaban saya, mungkin kedua jawaban tersebut serupa. - person Lucas Zhang; 24.12.2019