2

オブジェクトが画面上を移動するときに、オブジェクトへのタッチを処理する必要があります。touchesBegan が呼び出されたら、オブジェクトを非表示にする必要があります。

これはUIViewControllerの私のコードです:

- (void)win {
    for (NSInteger i = 1; i <= 6; i++) {
        UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:[NSString stringWithFormat:@"rocket_%d.png", i]]];
        imageView.tag = 1000;
        CGSize size = imageView.image.size;
        [imageView setFrame:CGRectMake(200 + (i * 60), 500, size.width, size.height)];
        [self.view addSubview:imageView];
        [rockets addObject:imageView];
        [imageView setUserInteractionEnabled:YES];
    }
    [self startRockets];
}

- (void)startRockets {

    CGFloat timeInterval = 1.0;
    for (UIImageView *imageView in rockets)  {
        [UIView animateWithDuration:5.0 delay:timeInterval options:UIViewAnimationOptionAllowUserInteraction animations:^{
            [imageView setFrame:CGRectMake(imageView.frame.origin.x, 0, imageView.frame.size.width, imageView.frame.size.height)];
        } completion:nil];
        timeInterval += 1.0;
    }


}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [[event allTouches] anyObject];
    CGPoint touchLocation = [touch locationInView:self.view];
    NSArray *views = [self.view subviews];
    for (UIView *v in views) {
        if (v.tag == 1000) {
            if (CGRectContainsPoint(v.frame, touchLocation) == YES) {
                [v setHidden:YES];
            }
        }
    }
}
4

2 に答える 2

9

AllowAnimatedContent が不足している可能性があります。変更してみてください

UIViewAnimationOptionAllowUserInteraction

UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionAllowAnimatedContent


...別の方法は、次を使用することUITapGestureRecognizerです。

- (void)createViews {
    rockets = [[NSMutableArray alloc] init];
    for (NSInteger i = 1; i <= 6; i++) {
        UIView *view = [UIView new];
        view.backgroundColor = [UIColor redColor];
        view.frame = CGRectMake((i * 60), 100, 50, 50);

        UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(rocketTouched:)];
        [view addGestureRecognizer:tap];

        [self.view addSubview:view];
        [rockets addObject:view];
    }
    [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(moveViews) userInfo:nil repeats:YES];
}
- (void)moveViews {
    for (UIView * view in rockets)  {
        [UIView animateWithDuration:5.0 delay:0.0 options:UIViewAnimationOptionAllowUserInteraction|UIViewAnimationOptionAllowAnimatedContent animations:^{
            view.frame = CGRectMake(view.frame.origin.x -10, 0, view.frame.size.width, view.frame.size.height);
        } completion:nil];
    }
}
- (void)rocketTouched:(UITapGestureRecognizer*)tap {
    tap.view.hidden = YES;
}
于 2012-11-17T15:37:22.497 に答える
0

オブジェクトとの交差を検出する必要がある場合は、これもチェックする必要があります。

touchesBegan メソッドを編集しましたが、動作します。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [[event allTouches] anyObject];
    CGPoint touchLocation = [touch locationInView:self.view];
    for (UIImageView *imageView in rockets) {
        CALayer *bbl1ObjPresentationLayer = (CALayer*)[imageView.layer presentationLayer];
        if(CGRectIntersectsRect(bbl1ObjPresentationLayer.frame, CGRectMake(touchLocation.x, touchLocation.y, 1, 1))) {
            NSLog(@"intersect");
                //They are intersecting
            }
}
}

UIImageView オブジェクトの代わりに CALayer を使用してそれを行うと、これは正しく機能します。この回答リンクを確認してください

于 2012-11-17T19:37:44.377 に答える