1

我将如何在 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
    }
}
4

1 回答 1

2

我真的不知道这是什么原因。但是,我使它以两种不同的方式工作:

  1. 通过将图层的默认类型保留为CALayer,创建一个新的CATiledLayer并将其作为子图层添加到视图的Layer. 我想这不是一个合适的解决方案。

  2. 通过使用WeakDelegate, 而不是强类型Delegate. 将以下内容放在您的视图子类中:

    [导出("drawLayer:inContext:")]

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

并更改以下行

tiledLayer.Delegate = new TiledLayerDelegate (this);

到:

tiledLayer.WeakDelegate = this;
于 2012-02-20T17:52:16.617 回答