2012-04-05 54 views
0

我在我的代碼中使用了CALayers動畫。 下面是我的代碼CALayer中的事件

CALayer *backingLayer = [CALayer layer]; 
     backingLayer.contentsGravity = kCAGravityResizeAspect; 
     // set opaque to improve rendering speed 
     backingLayer.opaque = YES; 


     backingLayer.backgroundColor = [UIColor whiteColor].CGColor; 

     backingLayer.frame = CGRectMake(0, 0, templateWidth, templateHeight); 

     [backingLayer addSublayer:view.layer]; 
     CGFloat scale = [[UIScreen mainScreen] scale]; 
     CGSize size = CGSizeMake(backingLayer.frame.size.width*scale, backingLayer.frame.size.height*scale); 
     UIGraphicsBeginImageContextWithOptions(size, NO, scale); 
     CGContextRef context = UIGraphicsGetCurrentContext(); 
     [backingLayer renderInContext:context]; 

     templateImage = UIGraphicsGetImageFromCurrentImageContext(); 

     UIGraphicsEndImageContext(); 

這backingLayer有許多子層加入這樣的,這種觀點是我的子視圖。 但現在我怎麼能在各自的UIViews中獲得視圖的事件,因爲我已經將它們添加爲子圖層,我試圖實現類似Flipboard應用程序的東西,它們具有頁面導航並單擊事件,即使它們是子圖層。

回答

2

CALayers的重點在於它們重量輕,尤其是沒有事件處理開銷。這就是UIView的用途。您的選擇是將您的代碼轉換爲使用UIViews進行事件跟蹤,或者編寫自己的事件傳遞代碼。對於第二個,基本上,你應該讓你包含的UIView爲每個子層的邊界做一堆「rect」查詢,並將事件傳遞給具有最高z位置的CALayer中的一個自定義方法。

1

正如claireware提到的,CALayers不直接支持事件處理。但是,您可以在包含CALayer的UIView中捕獲事件,並向UIView的隱式層發送'hitTest'消息以確定哪一層被觸摸。例如:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [touches anyObject]; 
    CGPoint location = [touch locationInView:self]; 
    CALayer *target = [self.layer hitTest:location]; 
    // target is the layer that was tapped 
} 

這裏是關於則hitTest從蘋果公司的文檔的詳細信息:

Returns the farthest descendant of the receiver in the layer hierarchy (including itself) that contains a specified point. 

Return Value 
The layer that contains thePoint, or nil if the point lies outside the receiver’s bounds rectangle.