2012-05-24 3 views
2

터치 좌표를 중심으로 원을 그리도록 앱을 만들고 싶습니다.iOS 5 - 터치시 원을 그립니다.

여기에 제가 지금 가지고있는 코드가 있습니다. 확실히 엉망입니다. 나는 물건을 그리거나 문맥을 다루는 연습을하지 않았습니다. 내가 여기서 무엇을 놓치고 있니? 미리 감사드립니다.

보기 컨트롤러의 UIViewController

@implementation ViewController 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
if (self) { 
    // Custom initialization 
} 
return self; 
} 

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
} 

- (void)viewDidUnload 
{ 
[super viewDidUnload]; 
} 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
UITouch *theTouch = [touches anyObject]; 

[self doSomething]; 

//[self.view setNeedsDisplay]; 

} 

- (void) drawCircleAtPoint:(CGPoint)point withRadius:(CGFloat)radius inContext:(CGContextRef)context{ 
UIGraphicsPushContext(context); 
CGContextBeginPath(context); 
CGContextAddArc(context, point.x, point.y, radius, 0, 2*M_PI, YES); 
CGContextFillPath(context); 
UIGraphicsPopContext(); 
} 

- (void)drawRect:(CGRect)rect 
{ 
CGPoint point; 
CGContextRef context = UIGraphicsGetCurrentContext(); 
point.x = self.view.bounds.origin.x + self.view.bounds.size.width/2; 
point.y = self.view.bounds.origin.y + self.view.bounds.size.height/2; 
CGContextSetLineWidth(context, 5.0); 
[[UIColor whiteColor] setFill]; 
[self drawCircleAtPoint:point withRadius:50 inContext:context]; 

} 

@end 
여기

나는 그것이 적어도 화면의 중앙에 원을 그리는 원의 서브 클래스입니다,하지만 난이 작업을 수행 할 수 없습니다. 의 UIViewController보기를 관리하고, 위임 및 기타 관련 항목 자체를 처리 -

+1

왜 하얀 채우기를하고 있니? 배경색은 무엇입니까? – heckman

답변

4

drawRect는 UIView 클래스의 메서드입니다. ViewController에서는 사용할 수 없으므로 호출 할 필요가 없습니다.

당신이해야 할 일은 drawView와 drawCircleAtPoint를 UIView 하위 클래스에 배치하는 것입니다. 또한 해당 뷰 클래스의 touches 메소드를 추가하십시오. DrawCircleView 또는 그 외 호출 할 수 있습니다.

이제이 사용자 지정보기의 개체를 만들고이보기를 viewDidLoad의 viewcontroller보기에 하위보기로 추가하십시오.

touches 메소드에서 setNeedsDisplay를 호출하고 toPoint의 포인트를 CGPoint 인스턴스 변수에 저장하고 drawRect에 액세스합니다.

UPDATE

당신은 이전에 그려진 원을 절약 할 수 있습니다.

많은 가능성이 있습니다. 당신에게 가장 어울리는 것을 선택하십시오. 나는 각자에 대한 자세한 설명을하지는 않았지만 당신을 얻기에 충분한 정보를주었습니다.당신이 원 편집하고 싶다면

  • 당신은 NSMutableArray를 한 대상으로 중심과 반경에 관한 원 정보를 계속 추가해야합니다. 그리고 drawRect 시작 부분에 모든 루프를 다시 그려야합니다. 나는 당신이 마지막의 drawRect 통화에서 이전 정보를 유지하도록 인스턴스 var과 같은 CGPath 유지의 drawRect에 cgcontext의 경로를 해당 경로에 CGPath 및 킵 추가 원을 사용하고 추가 제안

    Infact는. 다시 다른 색으로 그려진 원을 가질 수있게하려면 서로 다른 CGPath에 있어야합니다. 그런 다음 개체의 색 정보가있는 CGPath를 변경 가능한 Array에 다시 추가 할 수 있습니다.

또는

  • 저장하고 배열이 계속 성장하면 성능을 방해합니다 모든 원을 다시 그리는

    . 실행 취소 기능을 원하지 않거나 이전 서클을 편집하고 싶지 않은 경우 그런 다음 drawRect의 끝 부분에 imageData로 그려진 내용을 저장 한 다음 인스턴스 var로 유지하고 drawRect가 호출 될 때마다 다시 그릴 수 있으며 그 위에 원을 그려 이미지를 다시 같은 인스턴스에 저장할 수 있습니다.

예 : drawRect의 끝에서 화면의 이미지를 인스턴스 변수 _savedImage에 저장할 수 있습니다.

_savedImage = UIGraphicsGetImageFromCurrentImageContext(); 

과의 drawRect의 시작 부분에서 다시 그리는 동안

, _savedImage 다음하지 전무 경우,

[_savedImage drawInRect:rect]; 

는 당신은 당신이 도청 지점 주위에 원을 그릴 수 있습니다. 그런 다음 원하는 경우 은 또한 당신은 당신이 원하는 실제 이미지 파일을 언제로 그림을 저장할 수 있습니다

NSData *imageData = UIImagePNGRepresentation(_savedImage); 
[imageData writeToFile:@"imageName.png"]; 

또는 당신이 그들은 밀어 팝업 컨텍스트하는 데 사용됩니다 CGContextSaveGState() and CGContextRestoreGState() 탐색 할 수 있습니다 원하는 경우

  • 각각 쌓는다. 마지막 컨텍스트를 가져 와서 다시 그릴 수 있으며 복원과 저장 사이에 서클을 그릴 수 있습니다. 같은 스택에있는이 오버 플로우 소식을 확인하십시오. drawRect 및 drawCircle 코드를 실행하고 있음을 확인 했습니까? Saving and restoring CGContext
+0

감사! 하지만 매번 탭하면 새 서클이 그려지며 이전 서클은 삭제됩니다. 터치로 새로운 서클을 그리기 위해 할 수있는 일이 있습니까? – nemesis

+0

내 업데이트를 확인하십시오 @nemesis. –

+0

사실 나는 실제로 작동하도록 만들었습니다! 것은 - 당신이 클릭 할 때, 원에 대한 임의의 반지름을 생성하고, 이것은 좀 멋지다. 나는 Circle이라는 클래스를 만들었고, 좌표를 추가 할 때 그것들을 다시 그리기 위해 좌표와 반지름을 저장한다. 새로운 원. 그리고 지금 내가하고 싶은 것은 서로가 겹치지 않도록 만드는 것입니다.제 말은 - 호 안에 5 개의 큰 원이 있고 그 사이에 새로운 원을 넣으려고하면 특정 반경이 생깁니다. 이 질문을하는 또 다른 방법은 2 가지 CGRect가 교차하는지 판단 할 수있는 방법이 있습니까? – nemesis

3

은의 drawRect의 메소드 호출하지 의 UIViewController에서는, UIView의 발생합니다. 드로잉은 viewController의 view 속성에서 발생합니다. 귀하의 경우에는

, 다음을 수행 할 것 다음의 drawRect로, 자신의 관점

  1. 서브 클래스에 UIView를하고 drawCircle의 방법이 구현
  2. 자신과 XIB의 기본 UIView의 교체 클래스 (IB -> 신원 관리자 -> 사용자 정의 클래스)
  3. 손가락 접촉을 감지 한 다음 [보기 setNeedsDisplay]

주를 사용하여 새로 고침을 강제로 이벤트를 후크 : S ubclassing하고있는 UIImageView의의 drawRect을 무시하는 것은 아무것도하지 않는다 -는 특수하게 처리됩니다 :

있는 UIImageView 클래스는 디스플레이의 이미지를 그리는 최적화되어 있습니다. UIImageView는 drawRect : 하위 클래스를 호출하지 않습니다. 하위 클래스에 사용자 지정 그리기 코드가 필요한 경우 UIView를 클래스로 사용하는 것이 좋습니다.