2012-02-20 1 views
1

CATiledLayer에서 터치 이벤트를 캡처하는 방법은 무엇입니까?CATiledLayer, CALayerDellegate 및 터치 이벤트 캡처

필자는 뷰 계층을 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

정말 이유가 무엇인지 모르겠습니다.

  1. 을 새로운 CATiledLayer를 만들고 뷰의 Layer에 하위 레이어로 추가, CALayer에 레이어의 기본 유형을두면 : 그러나, 나는이 두 가지 방법으로 작업을했다. 나는 이것이 적절한 해결책이 아니라고 생각한다.

  2. 강하게 입력 된 Delegate 대신 WeakDelegate을 사용합니다. [("drawLayer : inContext :") 수출]

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

다음 줄

tiledLayer.Delegate = new TiledLayerDelegate (this); 

에 변경 :

: 당신의 뷰 서브 클래스에 다음을 놓고

tiledLayer.WeakDelegate = this;