2013-06-24 2 views
0

저는 IOS에 익숙하지 않습니다. 루프에서 뷰를 그리는 데 문제가 있습니다. 이것은 MyView.m 클래스의 drawRect 메서드입니다. :반복에서 뷰를 그리는 방법, 무한 루프에 setNeedsDisplay 메서드를 추가 했으므로

`

-(void)drawRect:(CGRect)rect 
{ 
    self.backgroundColor = [UIColor blackColor]; 
    x = rand() % (200 - 0) + 0; 
    y = rand() % (200 - 0) + 0; 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextBeginPath(context); 
    CGContextMoveToPoint(context, 0, 0); 
    CGContextAddLineToPoint(context, 160+x, 150+y); 
    CGContextAddLineToPoint(context, 160+x, 120+y); 
    CGContextAddLineToPoint(context, 200+x, 200+y); 
    CGContextAddLineToPoint(context, 200+x, 170+y); 
    CGContextAddLineToPoint(context, 250+x, 250+y); 

    CGContextClosePath(context); 
    [[UIColor whiteColor] setFill]; 
    [[UIColor redColor] setStroke]; 
    CGContextDrawPath(context, kCGPathFillStroke); 
    NSLog(@"drawRect x: %d,%d",x,y); 
    } 

`

MYVIEW는 XIB의 하위 뷰로의 ViewController에 첨가된다.

viewController.m에서이 내 while 루프

:

-(void)buttonClicked:(id)sender 
{ 
    while (TRUE) { 


     NSLog(@"while"); 
     NSThread* myThread = [[NSThread alloc] initWithTarget:self selector:@selector(reDraw)object:nil]; 
     [myThread start]; 
    // [NSThread detachNewThreadSelector:@selector(reDraw) toTarget:self withObject:nil];   
     //[self performSelector:@selector(reDraw) withObject:nil afterDelay:1]; 
     NSLog(@"after sleep"); 
      } 
} 


-(void)reDraw { 
    [myView setNeedsDisplay]; 

} 

은 buttonClicked 내가 루프 setNeedsDisplay 방법을 반복하는 동안 시작 버튼을 누를 때 호출되는 방법은, 문제는 내가 버튼을 누를 때 모든 것은 멈추고 드로잉을 받아들이게됩니다. 버튼이 클릭 된 상태로 유지되고 다른 모든 구성 요소가 중지됩니다.

+0

iOS를 처음 사용하는 경우 왜 NSThread 메서드를 사용하려고합니까? 그'buttonClicked :'메소드는 끔찍합니다. – Abizern

답변

2

버튼을 누르면 주 스레드의 무한 루프로 이동합니다. 주 스레드는 모든 도면을 수행하는 스레드입니다. 드로잉은 setNeedsDisplay의 결과로 직접적으로 수행되지는 않지만, 수행하는 모든 작업은 그리기 요청을 대기열에 넣은 다음 주 스레드를 중지하므로 결코 완료되지 않습니다.

기본적으로 어떤 이유로 든 주 스레드를 잠자워 마셔서는 안됩니다.

reDraw 메서드는 사용자가 설정 한 속도로 실행되며 기본 스레드를 차단하지 않으므로 NSTimer을 사용하여보아야합니다.

+0

도움을 주셔서 감사합니다. 나는 그 후에 그 사실을 알려 드릴 것입니다. – user2353484