0

だから、私はアニメーション化されたUIImageを持つUIImageViewを持っています。UIImageView自体は、CAKeyframeAnimationとCGMutablePathRefを使用してアニメーション化され、パスにランダム性を提供します。私の問題は、誰かがアニメーション化されたUIIMageViewをタップしたときに追跡する必要があることです。

これでしばらく壁に頭をぶつけてきました。UITouchを画面上のUIImageのプレゼンテーション層の位置と比較する必要があるようですが、座標を取得する方法がわかりません。それ。

したがって、主な質問は、画面全体でアニメーション化されているUIIMageViewの座標を取得し、タップが発生した場所と比較するにはどうすればよいですか?

今のようにコードを実行すると、エラーがスローされます。

-[CALayerセンター]:認識されないセレクターがインスタンス0xa105150に送信されました

クラッシュすることはなくなりましたが、画面上を移動するときにUIImageViewの位置を特定する方法についてはまだ迷っています。

私の関連するコードは以下の通りです。どんな助けでも大歓迎です。

- (void)animateCarrierFish
{
    NSInteger getWhichFish = (arc4random()%[self.fishes count]);
    NSArray *selectedFish = [NSArray arrayWithArray:[self.fishes objectAtIndex:getWhichFish]];
    UIImage *fishName = [selectedFish objectAtIndex:0];

    UIImageView *fishCarrier = [[UIImageView alloc] initWithImage:fishName];
    fishCarrier.animationImages = selectedFish;
    fishCarrier.animationDuration = 1.5;
    fishCarrier.animationRepeatCount = 0;
    fishCarrier.frame = CGRectMake(0, 0, fishName.size.width*screenScale, fishName.size.height*screenScale);

    NSInteger startPoint;
    NSInteger endPoint;
    NSInteger oppositeMod;

    NSInteger fromWhichDirection = (arc4random()%2);
    if(fromWhichDirection==1)
    {
        startPoint = rightEdge;
        endPoint = leftEdge;
        oppositeMod = -rightEdge;
        fishCarrier.transform = CGAffineTransformMakeScale(-1, 1);
    } else {
        startPoint = leftEdge;
        endPoint = rightEdge;
        oppositeMod = 0;
    }

    NSInteger aniSpeed = [self getRandomNumberBetweenMin:15 andMax:20];

    CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
    pathAnimation.duration = aniSpeed;
    pathAnimation.calculationMode = kCAAnimationCubic;
    pathAnimation.fillMode = kCAFillModeForwards;
    pathAnimation.removedOnCompletion = NO;

    CGMutablePathRef pointPath = CGPathCreateMutable();

    NSInteger yPoint = [self getRandomNumberBetweenMin:waterLine andMax:seaFloor];
    CGPathMoveToPoint(pointPath, NULL, startPoint, yPoint);

    NSInteger howManyDips = [self getRandomNumberBetweenMin:2 andMax:4];

    int i=0;
    for (i = 0; i < howManyDips; i++)
    {
        yPoint = [self getRandomNumberBetweenMin:waterLine andMax:seaFloor];
        NSInteger xMod = [self getRandomNumberBetweenMin:-25 andMax:25];

        NSInteger xPoint = (([[UIScreen mainScreen] bounds].size.height/(howManyDips+1))*(i+1)) + xMod + oppositeMod;
        if (xPoint <0)
        {
            xPoint = xPoint*-1;
        }
        CGPathAddLineToPoint(pointPath, NULL, xPoint, yPoint);
    }

    yPoint = [self getRandomNumberBetweenMin:waterLine andMax:seaFloor];
    CGPathAddLineToPoint(pointPath, NULL, endPoint, yPoint);
    pathAnimation.path = pointPath;
    CGPathRelease(pointPath);


    [fishCarrier.layer addAnimation:pathAnimation forKey:@"pathAnimation"];
    [self.view addSubview:fishCarrier];
    [fishCarrier startAnimating];

    fishCarrier.userInteractionEnabled = YES; // these two lines don't seem to do anything
    fishCarrier.multipleTouchEnabled = YES;
    fishCarrier.tag=[self.swimmers count];

    [self.swimmers addObject:fishCarrier];
}

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesBegan:touches withEvent:event];

    UITouch *touch = [touches anyObject];
    CGPoint touch_point = [touch locationInView:self.view];


    for (UIImageView *image in self.swimmers) {
        // HOW do I get the coordinates in the main view of this sublayer?
    }
}
4

2 に答える 2

1

touchesBeganメソッドに次の変更を加えることで、最終的にオブジェクトが画面上のどこにあるかをレポートすることができました。

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesBegan:touches withEvent:event];

    UITouch *touch = [touches anyObject];
    CGPoint startPoint = [touch locationInView:self.view];
    CGFloat x = startPoint.x;
    CGFloat y = startPoint.y;

    //create touch point
    CGPoint touchPoint = CGPointMake(x, y);

    // loop through the items we're iterested in being tapped on here
    for (UIImageView *fish in self.swimmers) {
        CGRect fishFrame = [[fish.layer presentationLayer] frame];

        if (CGRectContainsPoint(fishFrame, touchPoint)) {
            NSLog(@"You hit fish: %u",fish.tag); // do stuff here
        }
    }
}
于 2013-03-06T16:17:28.997 に答える
0

なぜあなたはメッセージCALayerに応答することを期待しますか?そのドキュメントcenterを読んだら、という名前のメソッドを実装していないことがわかります。レイヤーの幾何学的中心を取得する場合は、手動で計算します。center

CGPoint center;
center.x = CGRectGetMidX(layer.bounds);
center.y = CGRectGetMidY(layer.bounds);

編集:スーパー(レイヤー?ビュー?何でも...)に対して中心が必要なようです:

CGPoint center;
center.x = CGRectGetMidX(layer.frame);
center.y = CGRectGetMidY(layer.frame);
于 2013-03-04T19:26:37.243 に答える