关于ios:如何在迭代中绘制View,因为我已经将setNeedsDisplay方法放入了无限while循环

How to draw on View in iteration, as i had put the setNeedsDisplay method into infinite while loop

我是 iOS 新手,在循环中绘制视图时遇到问题,这是 MyView.m 类中的 drawRect 方法:

`

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
-(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 中的 subView 添加到 ViewController 中。

这是我在 viewController.m 中的 while 循环:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    -(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 是当我按下按钮启动 while 循环时调用的方法,它迭代 setNeedsDisplay 方法,问题是当我按下按钮时,一切都停止工作接受绘图。按钮保持单击状态,所有其他组件都停止。


当您按下按钮时,您将进入主线程上的无限循环。主线程是完成所有绘图的线程。 setNeedsDisplay 的结果并不是直接完成绘图,所以你所做的只是将大量的绘图请求排队,然后停止主线程,这样它就永远不会完成。

基本上,无论出于何种原因,你都不应该让主线程hibernate。

您应该考虑使用 NSTimer 来调用您的 reDraw 方法,因为它会以您设置的速率运行并且不会阻塞主线程。