1

私はあなたがタッチで異なる文字(の形でUILabels)を動き回らなければならないアプリを持っています。さまざまなUILabelオブジェクトが存在するため、このコードを作成してみました。これにより、ラベルがくっつくのを防ぎます。

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

UITouch *touch = [[event allTouches] anyObject];

CGPoint touchPoint = [touch locationInView: self.view];


bool pickup = YES;


if (pickup) {

    if (CGRectContainsPoint(a.frame, touchPoint)) {

        a.center = touchPoint;

        pickup = NO;
    }
}

if (pickup) {

    if (CGRectContainsPoint(x.frame, touchPoint)) {

        x.center = touchPoint;
        pickup = NO;

    }

}

if (pickup) {

    if (CGRectContainsPoint(x2.frame, touchPoint)) {

        x2.center = touchPoint;
        pickup = NO;

    }

}
if (pickup) {

    if (CGRectContainsPoint(eq.frame, touchPoint)) {

        eq.center = touchPoint;
        pickup = NO;

    }

}        

if (pickup) {

    if (CGRectContainsPoint(b.frame, touchPoint)) {

        b.center = touchPoint;
        pickup = NO;

    }

}


}

しかし、ここにいくつかの問題があります:

  1. 移動はスムーズではありません。指が画像を移動すると、ラベルの移動が停止します(明らかにif (CGRectContainsPoint(a.frame, touchPoint))

  2. また、別のラベルを移動しているときにラベルをバイパスすると、バイパスしたラベルが指で移動し始めます。

どうすればこれを行うことができますか、私は今私がしていることよりも良い方法があることを知っています...

4

2 に答える 2

2

すべてを1つの連鎖アニメーションにまとめてみてください。これtouchesMovedは古い学校です。各ラベルにジェスチャ認識機能を追加します。次に、そのセレクターでこれを試してください-

- (void)labelTouchSelector:(UIGestureRecognizer *)gesture
{
    CGPoint touchPoint = [gesture locationInView: self.view];

    [UIView animateWithDuration:1.0 
                          delay:0 
                        options:UIViewAnimationOptionCurveLinear | UIViewAnimationOptionAllowUserInteraction
                     animations:^(void) 
     {
         if(CGRectContainsPoint(a.frame, touchPoint))
         {
              a.center = touchPoint;
              pickup = NO;
         }
     } 
     completion:^(BOOL finished) 
     {
         if(finished)
         {
             //do some cleanup here
             pickup = NO;
         }
     }];
    return;
}
于 2012-06-09T03:11:38.150 に答える
0

touchesBegan、touchesMoved、touchesEndedを実装する新しいUILabelクラスを作成してみます。それぞれのメソッドに関連するコードを入れてください。メンバーに文字の値を割り当てるこのクラスのメソッドを作成します。ViewControllerでこのクラスの新しい各オブジェクトをインスタンス化し、label.centerなどの他の必要な詳細とともにその文字をここに設定します。これがお役に立てば幸いです。

私のコードの例(UIImageを使用しているので、UILabelを使用してクラスを初期化する方法を見つける必要がありますが、標準のメソッドはそうします):

@implementation myClass

- (id)initWithImage:(UIImage *)image
{
    if (self = [super initWithImage:image])
        self.userInteractionEnabled = YES;

    return self;
}


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

    UITouch * touch = [touches anyObject];
    pos = [touch locationInView: self];


    self.center = pos;


        NSLog(@"Touches Began Called.");

}


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

    activePoint = [[touches anyObject] locationInView:self];    

    int dx = self.center.x + (activePoint.x - pos.x); 
    int dy = self.center.y + (activePoint.y - pos.y);

    CGPoint newPoint = CGPointMake(dx,dy);
    self.center = newPoint;

        NSLog(@"Touches Moved Called.");


}

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



    NSLog(@"Touches Ended Called.");

}
于 2012-07-01T18:21:23.340 に答える