2009-11-04 5 views
1

터치하여 화면에 도형을 그릴 응용 프로그램을 만들려고합니다.도형을 그릴 때 선이 지워집니다.

한 점에서 다른 점까지 선을 그릴 수는 있지만 새로운 각 그리기마다 지워집니다.

CGPoint location; 
CGContextRef context; 
CGPoint drawAtPoint; 
CGPoint lastPoint; 
-(void)awakeFromNib{ 
    //[self addSubview:noteView]; 
} 

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [[event allTouches] anyObject]; 
    location = [touch locationInView:touch.view]; 
    [self setNeedsDisplayInRect:CGRectMake(0, 0, 320, 480)]; 
} 

- (void)drawRect:(CGRect)rect { 
    context = UIGraphicsGetCurrentContext(); 
    [[UIColor blueColor] set]; 
    CGContextSetLineWidth(context,10); 
    drawAtPoint.x =location.x; 
    drawAtPoint.y =location.y; 
    CGContextAddEllipseInRect(context,CGRectMake(drawAtPoint.x, drawAtPoint.y, 2, 2)); 
    CGContextAddLineToPoint(context,lastPoint.x, lastPoint.y); 
    CGContextStrokePath(context); 

    lastPoint.x =location.x; 
    lastPoint.y =location.y; 
} 

이 도움말 -

Nir 씨가 감사합니다 :

여기 내 코드입니다.

답변

2

발견 했으므로 -drawRect는보기의 내용을 표시하는 곳입니다. 여기서 그린 그림은 화면에 '보게'됩니다.

플래시와 같이 스테이지에 선을 포함하고있는 무비 클립을 추가하는 경우보다 훨씬 더 낮은 레벨이며, 나중에 무대에 선을 포함하는 다른 무비 클립을 추가하면 이제 두 라인이 표시됩니다! 당신은 몇 가지 작업 및 prdobably 설정 같은 뭔가를해야 할 것입니다

..

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

    UITouch *touch = [[event allTouches] anyObject]; 
    location = [touch locationInView:touch.view]; 

    [self addNewLineFrom:lastPoint to:location]; 

    lastPoint = location; 

    [self setNeedsDisplayInRect:CGRectMake(0, 0, 320, 480)]; 
} 

- (void)drawRect:(CGRect)rect { 

    context = UIGraphicsGetCurrentContext(); 

    for(Line *eachLine in lineArray) 
     [eachLine drawInContext:context]; 

} 

나는 당신이 필요로하는 무슨이를 구체화하는 방법을 볼 수 있다고 생각합니다.

또 다른 방법은 CALayers를 사용하는 것입니다. 이 방법을 사용하면 안쪽에 그려지지 않습니다. - (void) drawRect - 레이어를 추가 및 제거하고, 내부에서 좋아하는 것을 그립니다. 뷰는 함께 합성하고 필요에 따라 화면을 그릴 수 있습니다. 아마 당신이 찾고있는 것보다.

+0

나는 UILayers 대신에 CALayers를 의미한다고 생각합니다. 그는 여전히 CALayer의 drawInContext : 메소드 또는 delegate-drawLayer : inContext : 메소드에서 사용자 정의 드로잉을 수행해야하지만 레이어가 다시 그릴 때까지 해당 레이어가 내용을 보존하게됩니다. –

+0

감사합니다, 당신의 권리 - 나는 대답을 받았다. –

1

drawRect이 호출 될 때마다 빈 슬레이트로 시작합니다. 다시 그리기 위해 이전에 그렸던 모든 것을 추적하지 않으면 오래된 손가락이 아닌 최신 스 와이프 만 그립니다. drawRect이 호출 될 때마다 손가락을 다시 쓸 수 있도록 모든 손가락 스 와이프를 추적해야합니다.

0

모든 줄을 다시 그리는 대신 이미지로 그려 넣은 다음 drawRect: 방법으로 이미지를 표시 할 수 있습니다. 이미지가 선을 누적합니다. 물론,이 방법은 실행 취소를 구현하는 것을 더 어렵게 만듭니다. iPhone Application Programming Guide에서

:

새로운 이미지 기반 그래픽 컨텍스트를 만들 수 UIGraphicsBeginImageContext 기능을 사용합니다. 이 컨텍스트를 만든 후에 이미지를 내용으로 그려 넣은 다음 UIGraphicsGetImageFromCurrentImageContext 함수를 사용하여 여러분이 그린 내용 을 기반으로 이미지를 생성 할 수 있습니다. 원할 경우 을 계속 드로잉하고 추가 이미지를 생성 할 수 있습니다. 이미지를 만들었 으면 UIGraphicsEndImageContext 함수를 사용하여 그래픽 컨텍스트를 닫습니다. 이 Core Graphics를 선호하면 CGBitmapContextCreate 함수 을 사용하여 비트 맵 그래픽 컨텍스트 을 만들고 이미지 내용을 그 안에 넣을 수 있습니다. 그리기를 마치면 CGBitmapContextCreateImage 함수를 사용하여 컨텍스트에서 CGImageRef를 만듭니다.Core 그래픽 이미지를 직접 그리거나이 이미지를 으로 사용하여 UIImage 객체를 초기화 할 수 있습니다.

관련 문제