2012-02-20 8 views
1

CATiledLayerでタッチイベントをキャプチャする方法はありますか?CATiledLayer、CALayerDelegateおよびキャプチャタッチイベント

ビューレイヤーを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 
    } 
} 

答えて

2

本当にこの理由がわかりません。 、CALayerに層のデフォルトタイプを残す新しいCATiledLayerを作成し、ビューのLayerにサブレイヤとして、それを追加することにより

  1. :しかし、私はそれは二つの異なる方法で働かせました。私はこれが適切な解決策ではないと思う。

  2. 強く型付けされたDelegateの代わりにWeakDelegateを使用することによって。

    を[エクスポート( "drawLayer:inContext:")]ビューのサブクラスで次のように置き

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

とに次の行

tiledLayer.Delegate = new TiledLayerDelegate (this); 

を変更:

tiledLayer.WeakDelegate = this;