Смешивание NSThreads и NSTimer для обновления представления - PullRequest
0 голосов
/ 18 февраля 2011

Я хочу сделать приложение, чтобы на экране появлялись и исчезали круги. Круги увеличены на TouchesBegan и меньше на ощупьEnd. Я могу сделать это по ОДНОМУ кругу, но я хочу делать это везде, где пользователь касается экрана. Я знаю, что должен работать с NSThreads, но мой пример не работает.

Это часть моего кода:

- (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;
            }
    }

1 Ответ

0 голосов
/ 18 февраля 2011

вам не нужен вторичный поток для обновления представления. просто используйте отложенный обратный вызов (NSTimer, нацеливаясь на основной поток), чтобы сделать недействительными области, которые вы должны нарисовать, и отследите положение ближайшего касания, чтобы вы знали, где центрировать рисунок. обратные обратные вызовы аннулирования будут объединены с использованием отложенного обратного вызова, что является бонусом.

...