2011-02-18 15 views
0

画面上に円を表示して消えるようにするアプリを作ってみたい。サークルはTouchesBeganで拡大され、touchesEndでは小さくなります。 私は1つのサークルでそれを行うことができますが、私はどこでもユーザが画面に触れることを望みます。 私はNSThreadsで作業する必要があることを知っていますが、私の例はうまくいきません。NSThreadsとNSTimerを組み合わせてビューを更新する

これは私のコードの一部です:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [touches anyObject]; 
    lastPoint = [touch locationInView:self.view]; 
    zoomIn = TRUE; 
    rayonCercle = 25; 

    //Creation d'un thread 
    timerThread = [[NSThread alloc] initWithTarget:self selector:@selector(cycle)   object:nil]; 
    [timerThread start]; 

    if ([touch tapCount] == 1) { 
      NSLog(@"une touche"); 
    } 

    if ([touch tapCount] == 2) { 
      drawImage.image = nil; 
      return; 
    } 
} 

    - (void) cycle { 

     NSLog(@"cycle"); 

     NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; 
     NSRunLoop* runLoop = [NSRunLoop currentRunLoop]; 
     time = [NSTimer scheduledTimerWithTimeInterval: 0.1 
     target: self 
     selector: @selector(drawCircle:) 
     userInfo: nil 
     repeats: YES]; 

    [runLoop run]; 
    [pool release]; 
} 

    - (void) drawCircle:(NSTimer *)timer { 

      NSLog(@"drawCircle"); 

      UIGraphicsBeginImageContext(self.view.frame.size); 
      [drawImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width,   self.view.frame.size.height)]; 


      CGGradientRef myGradient; 
      CGColorSpaceRef myColorSpace; 
      size_t locationCount = 3; 
      CGFloat locationList[] = {0.0, 0.5, 1.0}; 
      CGFloat colorList[] = { 
      1.0, 0.0, 0.5, 1.0, //red, green, blue, alpha 
      1.0, 0.0, 1.0, 1.0, 
      0.3, 0.5, 1.0, 1.0 
      }; 
      myColorSpace = CGColorSpaceCreateDeviceRGB(); 
      myGradient = CGGradientCreateWithColorComponents(myColorSpace, colorList, 
      locationList, locationCount); 

      CGContextDrawRadialGradient(UIGraphicsGetCurrentContext(), myGradient, lastPoint, 0,     lastPoint,rayonCercle, 0); 

      drawImage.image = UIGraphicsGetImageFromCurrentImageContext(); 
      UIGraphicsEndImageContext(); 

      if (rayonCercle < 200 && zoomIn == TRUE) { 
      _hue += 0.5; 
      _brightness += 0.005; 
      _saturation += 0.05; 
      rayonCercle += 15; 
      } 
      if (zoomIn == FALSE) { 
      if (rayonCercle < 0) { 
      [time invalidate]; 
      [timerThread release]; 
      } else { 
      _hue -= 0.5; 
      _brightness -= 0.005; 
      _saturation -= 0.05; 
      rayonCercle -= 1; 
      } 
    } 
} 


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

      _hue = 0.0; 
      _saturation = 0.0; 
      _brightness = 0.0; 

      rayonCercle = 25; 
      zoomIn = TRUE; 
    } 

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

      _hue = 0.0; 
      _saturation = 0.0; 
      _brightness = 0.0; 

      zoomIn = FALSE; 

      UITouch *touch = [touches anyObject]; 

      if ([touch tapCount] == 2) { 
        drawImage.image = nil; 
        return; 
      } 
    } 

答えて

0

ビューを更新するセカンダリスレッドを必要としません。ドローイングする必要がある領域を無効にするために遅延コールバック(NSTimer、メインスレッドを対象とする)を使用し、最も近くのタッチの位置を追跡して、図面をどこに配置するかを知るだけです。 rectコールバックコールは遅延コールバックを使用して結合されます。これはボーナスです。

+0

しかし、他のスレッドがなければ、同時にいくつかの円を小さくすることは可能でしょうか? – mickcoco

+0

時間の経過とともにイベントシーケンスを管理します。 drawRectが呼び出されると、描画呼び出しの時間(例えば、現在の時間)から描画するものの基になります。イベントの種類、時間、タッチ位置などを追跡する必要があります。この情報を使用すると、描画する内容、描画するサイズ、イベントが発生した時間(たとえば、フェードアウトしたい場合など)を知ることができます。助けてください – justin

+0

申し訳ありません私はそれを動作させることができません:(私は(タイマーで)表示するすべての形状を持つ配列を構築しようとし、別のタイマーで、私はすべての形状を描くために私の配列を参照しますが、仕事... – mickcoco

関連する問題