2012-10-17 2 views
6

내 애플리케이션은 간단한 그림의 드로잉을 수행 할 수 있습니다 (보다 안정적인 코드를 얻을 때까지 한 개의 그림 만 사용하고 있습니다). 또한 크기를 재조정 할 수 있습니다. (100.0f, 100.0f)의 입력 크기, 저를 제공UIView 드로잉 모범 사례

- (void)drawRect:(CGRect)rect 
{  
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    [self setContextFillColor:context]; 
    [self setContextStrokeColor:context]; 
    [self setLineWidth:context]; 

    CGFloat lineThickness = [self lineWidth] ; 
    CGFloat halfLineThickess = lineThickness/2.0f; 

    CGContextAddRect(context, CGRectMake(halfLineThickess,halfLineThickess, rect.size.width - lineThickness, rect.size.height - lineThickness)); 

    CGContextDrawPath(context, kCGPathEOFillStroke); 
} 

은이 :

enter image description here

이 그림은 내가 UIView을 만드는 데 사용하는 코드는 다음과 같다 내부는 "컨테이너"UIView이고, 차례로 UIScrollView입니다. 내 문제는 내 크기를 재조정 할 때 약 1000 * 1000 (내 "컨테이너"가 20,000 * 20,000) 크기에 도달하면 메모리 경고를 받기 시작하고 응용 프로그램이 결국 포기합니다. 따라서 내 질문은 다음과 같습니다.

1) UIView의 최대 크기를 입력해야합니까?

2) 계기를 사용하여 이러한 종류의 문제를 추적하고 문제가 어디서 발생하는지 (또는 무거운 작업이 어디에서 이루어지고 있는지) 어떻게 확인할 수 있습니까?

3) 어떤 종류의 캐싱을 this과 같이 사용해야합니까?

4) UIView을 그릴 때 고려해야 할 사항은 모범 사례입니까?이 있습니까?

5) 내가 만져야 할 것이지만 CALayer을 고려해야합니까?

UIView의 크기 조정은 주로 this을 기준으로합니다.

+0

QuartzCore 사용을 고려해 보았고보기의 레이어 속성을 사용하여 테두리를 그렸습니까? – runmad

+0

것은 : 이것은 간단한 그림입니다. 결국 나는 더 복잡한 것들을 가질 것이고, 나는'UIView'의 속성으로 놀아서도 충분하지 않을 것이라고 생각합니다. 그러나 제안에 감사드립니다. – Peres

+2

대용량 콘텐츠 (확대/축소)를 그릴 필요가있는 경우 'CATiledLayer'를 확인하고 싶을 수도 있습니다. http://developer.apple.com/library/ios/#documentation/GraphicsImaging/Reference/CATiledLayer_class/Introduction/Introduction.html – Bastian

답변

1

UIView를 크게 만들지 마십시오. 너무 큽니다. 이런 종류의 문제는 CATiledLayer이 처리하도록 설계된 것입니다. 기본적으로 도형의 경계 상자를 추적하고 경계 상자를 사용하여 어떤 도형이 어떤 도형과 교차하는지 파악해야합니다. 시스템이 주어진 타일을 요청하면, 그 타일과 교차하는 모든 모양을 그립니다. 매우 크고 복잡한 도형의 경우 도형을 분할하여 추가로 최적화 할 수 있지만 종종 필요하지 않습니다.

1

1) 올바른 접근 방식을 사용하면 크기가 문제가되지 않는다고 생각합니다.

2)는 계기가 메모리 문제

3,4

) 나는 그것이 좋은 방법이 아니다 - (void)drawRect:(CGRect)rect 생각 추적에 대해 WWDC 비디오에서 살펴 사용해야합니다. 그림 CALayer을 보면 더 좋을 것입니다. 도면에 사용자 정의 CGMutablePathRef을 사용할 수 있습니다.

그래서 UIView는 터치 처리에는 좋지만 모양 그리기에는 적합하지 않습니다.

+0

또한 특정 UIView (동작 및 크기 조정)에서 제스처를 처리하려고합니다. 그것은 여기에 문제가되지 않습니다 – Peres

+0

@JackyBoy는 몇 가지 단계입니다 : 1) 새로운 뷰를 생성 '의 UIView * view' 2) 새 레이어를 만들 '의 CALayer * shapeLayer view.layer = shapeLayer' 3) 추가 제스처 '[ addGestureRecognizer보기 : panGesture]; – Danil