0

コードでCALayersアニメーションを使用しています。以下は私のコードです

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には、このように多くのサブレイヤーが追加されており、このビューが私のサブビューです。しかし、サブレイヤーとして追加したので、それぞれのUIViewでビューのイベントを取得するにはどうすればよいですか?Flipboardアプリケーションのように、サブレイヤーであるにもかかわらずページナビゲーションとクリックイベントがあります。

4

2 に答える 2

2

CALayersのポイントは、軽量であり、特にイベント処理のオーバーヘッドがないことです。それがUIViewの目的です。オプションは、コードをイベント追跡にUIViewを使用するように変換するか、独自のイベント受け渡しコードを作成することです。2つ目は、基本的に、包含UIViewに、各サブレイヤーの境界に対して一連の「is point in rect」クエリを実行させ、そのイベントを最高のz位置を持つCALayer(のカスタムメソッド)に渡します。 。

于 2012-04-05T05:02:41.737 に答える
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
} 

Apple のドキュメントからの 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.
于 2012-10-26T15:59:59.833 に答える