2012-10-10 5 views
0

: - 내가 솔루션을 찾고 있었어요하지만 다음 작업을 수행 할 수 있는지 알아낼 수 없습니다 코코아

는 내가의 drawRect 방법을 가지고는, 내가하고 싶은 것은을 추가하는 것입니다 그래픽 요소 (예 : 직사각형 및 선)를 새로 고치지 않고 현재 뷰로 이동합니다. setNeedsDisplay를 호출하는 데 사용되었지만이 메서드는 실제로 myView를 0에서 다시 그리는 중 삭제합니다. 기존의 내용을 유지하고 새 내용을 추가 할 제안이 있습니까?

감사합니다.

답변

0

이것이 바로 drawRect :가하는 것입니다. 즉,보기에서 rect를 다시 그립니다.

선 및 직사각형을 맨 위에 그리려면 다른 레이어에서 선을 그립니다.

1

뷰에서 업데이트가있을 때마다 그 전체가 다시 그려집니다. 그래서 -drawRect는 전체 뷰를 다시 그려야합니다. 보기를 '새로 고침'해야합니다. 정상입니다. 아무 문제가 없습니다. 이전 콘텐츠를 다시 그립니다.

또는보기의 특정 섹션을 다시 그리려면 setNeedsDisplayInRect:으로 전화 할 수 있습니다.

+0

그래, 그렇지만 어떻게하면 다른 콘텐츠를 나중에 다시 그리기 위해 다른 콘텐츠를 "저장"할 수 있을까요? –

0

레이어 작업을하는 것이 좋습니다. 도형에 대한 CALayer 하위 클래스를 만든 다음 배열에 저장할 수 있습니다.

0

기본적으로 drawRect 메서드는 전체 내용을 지우고 동적으로 몇 가지 새 그래픽 내용을 뷰에 그리려면이 그래픽 요소의 데이터 구조를 추상화해야합니다 (예 : 선을 추가하면이 선은

을 정의

 
     a start point 
     a end point 
     line color 
     line width 
     is has a shadow 
     a line join

그래서 당신이 사용자 정의의 UIView에

-(void)drawLine:(CGContextRef)ctx withLineStruct:(LineStruct*)lineStruct 

라는 방법을 구조체로 모든 속성을 넣어 LineStruct라는 새 데이터 클래스를 정의하고 정의 할 수 있습니다

@property (nonatomic) LineStruct * lineStruct;

그 안에 호출은 다른 그래픽 내용이있는 경우, 당신이 그와 같은 무승부를 할 수 있도록의 drawRect 방법을

-(void)drawRect:(CGContextRef)ctx{ 
     CGContextRef ctx = UIGraphicsGetCurrentContext() ; 
     [self drawLine:ctx withLineStruct:self.lineStruct]; 
    } 

을합니다. 내용이 많은 경우 NSArray를 추가하는 등의 방법으로 UIView에 버퍼를 추가해야하고 drawRect 메서드에는 for()를 추가하여 모든 그래픽 요소를 그립니다.

0

아마도 모든 모양을 저장하고 새 모양을 추가하려면 NSBezierPath와 같은 것이 필요합니다. 기존 NSBezierPath에 새 셰이프를 추가하는 것은 쉽습니다. 문서를 참조하십시오. https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSBezierPath_Class/Reference/Reference.html 그런 다음 drawrect에서 NSBezierPath를 획 또는 칠해야합니다.

모든 모양에 동일한 채우기 색과 획이있는 경우에만 작동합니다. 그렇지 않으면 여러 NSBezierPaths 및 스트로크/일종의 목록을 유지할 수있는 다양한 방법으로 채 웁니다.

0

원래 iboutlet을 사용하여보기와 구분하여 그리려는보기를 만들면이 문제를 해결할 수 있습니다. 그런 다음 기본보기 배경을 투명하게 만듭니다 (그러나이 엽서는 투명하게 만들지 마십시오). 따라서이 예제에서는 유지하고자하는 IBOutlet (그려지지 않음)이 UITextField, UILabel 및 UIButton 인 것을 방지합니다. 그래서 당신은 인터페이스 빌더는 다음과 같이됩니다 : 당신이 볼 그래서으로

UIVIewController 
    UIView2 (view with drawRect defined) 
    UIView (main) 
    UITextField 
    UILabel 
    UIButton 

을, 당신이 '의 drawRect'호출 할 때 완전히 UIView2 밖으로 빈 여전히 것이다, 그러나 때문에 '의 drawRect를'중요하지 주신다 UILabel, UIButton, UITextField 또는 UIView1에 유지하려는 항목을 삭제하십시오. 희망이 도움이됩니다.