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

私は本当にこれの理由が何であるかを知りません。ただし、2つの異なる方法で機能させました。

  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;
于 2012-02-20T17:52:16.617 に答える