2013-08-31 15 views
8

Tworzę aplikację, w której przesuwając palcem po ekranie, tym razem rysuję linię za pomocą kodu.iOS Narysuj linię na przesuwającym palcu ze strzałką podążając za ścieżką Swipe

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); 
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(),3.0); 
    CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 0.0, 0.5, 0.6, 1.0); 
    CGContextBeginPath(UIGraphicsGetCurrentContext()); 
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), startPoint.x, startPoint.y); 
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), endPoint.x, endPoint.y); 
    CGContextStrokePath(UIGraphicsGetCurrentContext()); 
} 

I ja również przesuwając strzałkę w tym samym czasie na tej linii przy użyciu kodu ....

-(void)moveBallConstantly 
{ 
[UIView animateWithDuration:0.01f animations: ^{ 
     [appDel.ballImageView setCenter:CGPointMake(appDel.ballImageView.center.x +  (x/increamentFraction), appDel.ballImageView.center.y + (y/increamentFraction))]; 
    }]; 
} 

Jest tylko niewielka część funkcji. Jestem w stanie ciągle poruszać strzalką, ale dla lepszego płynnego poruszania się strzałki, wywołuję tę funkcję wielokrotnie za pomocą timera .01.

Tak jak ja robię oba przetwarzanie razem, tak więc czasami jest to problem tworzenia. Czasami metoda poruszania strzałą jest opóźniona, a czasami metoda drążenia linii zostaje opóźniona.

Plz powiedział mi, jak rozwiązać oba te zadania.

Thanx z góry.

Odpowiedz

0

Złomowałbym timer i przesuwa go w touchesMoved.

Moje rozwiązanie pozwala rysować na płótnie UIImageView i ma białe pudełko podążające za palcem podczas rysowania. Upuść go w dowolnym UIView go wypróbować:

// These should probably be @properties 
static CGPoint lastPoint; 
static CGPoint currentPoint; 
static UIView *box; 
static UIImageView *canvas; 

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

    // Create the canvas the first time. Should probably do this elsewhere 
    // but done here for paste-ability 
    if (canvas == nil) 
    { 
     canvas = [[UIImageView alloc] initWithFrame:self.frame]; 
     canvas.backgroundColor = [UIColor redColor]; 
     [self addSubview:canvas]; 
    } 

    // Create the box that follows the finger. Should probably do this elsewhere 
    // but done here for paste-ability 
    if (box == nil) 
    { 
     box = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)]; 
     box.backgroundColor = [UIColor whiteColor]; 
     [self addSubview:box]; 
    } 

    // Ensure we can see it and move it right away 
    box.alpha = 1.0f; 
    box.center = CGPointMake(currentPoint.x, currentPoint.y - 50); 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    currentPoint = [touch locationInView:self]; 

    // Set up everything for drawing 
    UIGraphicsBeginImageContext(canvas.frame.size); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    [canvas.image drawInRect:CGRectMake(0, 0, canvas.image.size.width, canvas.image.size.height)]; 
    CGContextSetLineCap(context, kCGLineCapRound); 
    CGContextSetLineWidth(context, 1); 
    CGContextSetStrokeColorWithColor (context, [UIColor blueColor].CGColor); 

    // Draw the path 
    CGContextBeginPath(context); 
    CGContextMoveToPoint(context, lastPoint.x, lastPoint.y); 
    CGContextAddLineToPoint(context, currentPoint.x, currentPoint.y); 
    CGContextStrokePath(context); 
    canvas.image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    // Animate the box very quickly to the new location 
    [UIView animateWithDuration:0.1f 
          delay:0 
         options:UIViewAnimationOptionCurveEaseInOut 
        animations:^{ 
         box.center = CGPointMake(box.center.x + (currentPoint.x - lastPoint.x), 
               box.center.y + (currentPoint.y - lastPoint.y)); 
        } 
        completion:nil]; 

    // Remember our last touch 
    lastPoint = currentPoint; 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    // Finish it off by fading out the box 
    [UIView animateWithDuration:0.4f animations:^{ 
     box.alpha = 0.0f; 
    }]; 
} 
+0

Będzie to narysować linię z ruchu palca, ale potrzebuję, aby przesunąć strzałkę również w tym samym czasie na linii, więc nie sądzę, że będą one concide ze sobą. Do poruszania strzałką używam timera, który nazywa się co 0,01 sekundy. – vntstudy

+0

Mam cię, oryginalne pytanie nie wspomniało o trzymaniu strzałki na linii :) Aby to zrobić, ustaw box.center tak, aby był równy ostatniemu punktowi. Jeśli nie chcesz lekkiej animacji, możesz po prostu pozbyć się bloku animacji w dotknięciach: Przenieś: zEvent :. –