0

ID付きのボールを追加する場所にUIViewがあります。ID 1のボールに触れると、指に沿って破線を描きます。

指を他のボールに移動したときに、これらのボールを検出してIDを確認する方法がわからない場合の問題。私が起こらなければならないことは、ID 2の次のボールに触れると、ラインフィニッシュがボール1からボール2に描画されたままになり、2から指に新しいボールを作成します。

コード:

#import "DrawView.h"

@implementation DrawView

- (id)init
{
    self = [super initWithFrame:CGRectMake(0, 0, 1024, 768)];
    if (self) {
        self.backgroundColor = [UIColor clearColor];
        self.opaque = YES;

        checkPointCircle = [[CheckPointCircle alloc] initWithPosX:315 posY:138 andNumber:1];
        checkPointCircle.userInteractionEnabled = YES;
        [self addSubview:checkPointCircle];

        checkPointCircle = [[CheckPointCircle alloc] initWithPosX:706 posY:138 andNumber:2];
        checkPointCircle.userInteractionEnabled = YES;
        [self addSubview:checkPointCircle];

        checkPointCircle = [[CheckPointCircle alloc] initWithPosX:315 posY:526 andNumber:3];
        checkPointCircle.userInteractionEnabled = YES;
        [self addSubview:checkPointCircle];

        checkPointCircle = [[CheckPointCircle alloc] initWithPosX:706 posY:526 andNumber:4];
        checkPointCircle.userInteractionEnabled = YES;
        [self addSubview:checkPointCircle];

    }
    return self;
}

- (Line *)drawLine {
    return drawLine;
}

- (void)setDrawLine:(Line *)line
{
    drawLine = line;
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];

    CheckPointCircle * checkTouch = (CheckPointCircle *)touch.view;

    if (touch.view.class == checkPointCircle.class) {
        if ([checkTouch getObjectID] == 1) {
            startTouchPoint = CGPointMake([checkTouch center].x, [checkTouch center].y);
            endTouchPoint = [touch locationInView:self];
        }
    }

    self.drawLine = [[Line alloc] initWithPoint:[touch locationInView:self]];
    [self setNeedsDisplay];
}

-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"Cancelado");
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{

    UITouch *touch = [touches anyObject];

    UITouch *secondaryTouch = (UITouch *)[[[event touchesForView:checkPointCircle] allObjects] objectAtIndex: 0];

    NSLog(@"Que toco: %@ ", secondaryTouch.view);

    if (touch.view.class == checkPointCircle.class) {
        CheckPointCircle * checkTouch = (CheckPointCircle *)touch.view;
        if ([checkTouch getObjectID] == 1) {
            endTouchPoint = [touch locationInView:self];
        }
    }
    [self setNeedsDisplay];
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CheckPointCircle * checkTouch = (CheckPointCircle *)touch.view;

    if (touch.view.class == checkPointCircle.class) {
        if ([checkTouch getObjectID] == 1) {
            endTouchPoint = [touch locationInView:self];
        }
    }
    [self setNeedsDisplay];
}

- (void)drawRect:(CGRect)rect
{
    [drawLine drawLineFrom:startTouchPoint to:endTouchPoint];
}

@end

IDを取得するために他のボールを検出する方法。

誰か助けてもらえますか?ありがとう!

4

1 に答える 1

0

クラスUIViewのAppleドキュメント(https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/occ/instm/UIView/hitTest:withEvent :)ヒット/ポイントを含むビューを決定する2つのメソッドをリストします。

– hitTest:withEvent:
– pointInside:withEvent:

おそらくhitTestが最も役立ちます。その説明には「指定されたポイントを含むビュー階層(それ自体を含む)でレシーバーの最も遠い子孫を返します。」と書かれているため、必要に応じて座標を変換することもできます。

touchesMoved:メソッドで[self hitTest:[touch.locationInView self] withEvent:event](または同様のコード補完なし;-) =をチェックすると、指が他のいずれかの上にあることを検出できるはずです。サークル。

これがお役に立てば幸い、ノビ

于 2012-07-20T11:29:26.517 に答える