CATiledLayer, CALayerDelegate и захват событий касания - PullRequest
1 голос
/ 20 февраля 2012

Как мне поступить с захватом сенсорных событий на CATiledLayer?

У меня есть следующая ситуация, когда при изменении слоя вида на CATiledLayer вид перестает захватывать события TouchesXXX. Почему это происходит и как мне решить эту проблему.

public partial class DocumentView : UIView
{
    public DocumentView ()
    {
        //if the following lines are removed touch events are captured
        //otherwise they are not
        var tiledLayer = Layer as CATiledLayer;
        tiledLayer.Delegate = new TiledLayerDelegate (this);
    }

    public override void TouchesBegan (NSSet touches, UIEvent evt)
    {
        //does not get called if we hook TiledLayerDelegate up there in the construct  
        base.TouchesBegan (touches, evt);
    }
}

public class TiledLayerDelegate : CALayerDelegate
{
    public DocumentView DocumentView;

    public TiledLayerDelegate (DocumentView documentView)
    {
        DocumentView = documentView;
    }

    public override void DrawLayer (CALayer layer, CGContext context)
    {
        //draw happens here
    }
}

1 Ответ

2 голосов
/ 20 февраля 2012

Я действительно не знаю, что является причиной этого.Однако я заставил его работать двумя различными способами:

  1. Оставив тип слоя по умолчанию для CALayer, создав новый CATiledLayer и добавив его в качестве подслоя кпросмотр Layer.Я думаю, что это неправильное решение.

  2. Используя WeakDelegate вместо строго типизированного Delegate.Поместите в подкласс вашего представления следующее:

    [Export ("drawLayer: inContext:")]

    public void DrawLayer(CALayer layer, CGContext context)
    {
        //draw happens here 
    }
    

и измените следующую строку

tiledLayer.Delegate = new TiledLayerDelegate (this);

до:

tiledLayer.WeakDelegate = this;
...