Метод Draw не вызывается из пользовательского UIView

Я создаю собственный значок карты (аннотацию) для iOS, рисую его путь, а затем конвертирую UIView в изображение, используя этот метод:

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;
    }
}

и это класс, производный от UIView, где я рисую путь аннотации:

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);
    }

Я изменяю Xamarin.Forms образец MapCustomRenderer, вместо того, чтобы загружать аннотацию из файла, я загружаю ее из представления:

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

но PinView.Draw() никогда не вызывают!


person mshwf    schedule 23.12.2019    source источник


Ответы (2)


Метод Draw будет вызываться после метода ViewDidLoad при первой загрузке элемента управления, который автоматически вызывается системой.

В вашем случае вы не установили Rect(Frame) PinView . Таким образом, метод Draw никогда не будет вызываться, потому что Rect по умолчанию равен нулю.

Таким образом, вы можете установить фрейм по умолчанию в конструкторе

public PinView()
{
  Frame = new CGRect (0,0,xx,xxx);
  ContentMode = UIViewContentMode.Redraw;
  SetNeedsDisplay();
}
person Lucas Zhang    schedule 23.12.2019
comment
Любая идея, почему представление выглядит как черный ящик? черные цвета не определены, и представление работает нормально при переходе к SetNativeControl средства визуализации пользовательского элемента управления. - person mshwf; 23.12.2019
comment
Вы могли бы предоставить образец, содержащий проблему, чтобы я мог протестировать ее на своей стороне. - person Lucas Zhang; 23.12.2019
comment
Я думаю из-за UIColor.Black.SetStroke(); - person Lucas Zhang; 23.12.2019
comment
в приложенном образце должно быть UIColor.Blue.SetStroke(); - person mshwf; 23.12.2019
comment
Я думаю Draw до сих пор не звонили :( - person mshwf; 23.12.2019

Представление нужно добавить в иерархию представлений, в моем случае в MKAnnotationView, поэтому в конструкторе 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);
}

и в конструкторе UIView Frame должен быть инициализирован, как сказал Лукас Чжан:

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

С этими изменениями вызывается метод Draw.

person mshwf    schedule 23.12.2019
comment
Не забудьте принять ответ, который поможет большему количеству людей :) - person Lucas Zhang; 23.12.2019
comment
Вы можете отредактировать свой ответ, указав более подробную информацию, или отредактировать мой ответ, возможно, эти два ответа похожи. - person Lucas Zhang; 24.12.2019