2012-06-20 2 views
1

사용자 지정 UIView가 포함 된 UIScrollView가 있습니다. 내 UIView에서 CGContextStrokePath를 사용하여 경로를 그리는 drawRect를 재정의했습니다. 확대/축소가 작동하는 방식을 약간 변경하고 싶습니다. 핀치 축소는 화면에 더 많은 경로를 표시합니다. 이것은 내가 원하는 것이지만 줄 너비를 줄이려면 축소하지 말고 축소하여 사용자에게 명확하게 전달하십시오.UIScrollView 선 너비를 변경하지 않고 CGContextStrokePath로 확대/축소

는 난 그냥이 (타겟이 _lineView라고 myUIView 줌)

-(void)scrollViewDidZoom:(UIScrollView *)pScrollView 
    { 
     _lineView.zoomScale = _scrollView.zoomScale; 
     [_lineView setNeedsDisplay]; 
    } 

다음 당신으로 일정한 선폭의 효과를주고 내 _lineView의 drawRect 방법에 적절한 라인 스트로크 크기를 계산을 할 것이라고 생각 축소.

이것은 매우 느리고 drawrect는 초당 몇 번이라도 호출되도록 최적화되지 않았기 때문에 이것이 예상됨을 읽었습니다.

그런 다음 GLKView 대신 OpenGL에서 모든 것을 직접 렌더링하기 시작했습니다. 이 문제는 모든 확대/축소 및 패닝을 직접 구현해야한다는 것입니다 (UiScrollView에서 무료로 얻을 수있는 멋진 확대/축소 및 팬 반송 효과 포함). OpenGL, 버튼 등에서 사용하고자하는 모든 컨트롤을 구현해야합니다.

Quartz2d를 계속 사용하는 방법이 있습니까? 나는 opengl이 나에게 많은 힘을 줄 것이라고 느낀다.하지만 내가 그 길로 가면 내 앱의 나머지 부분을 끝내는 데 더 오래 걸릴 것이다.

답변

2

나는 이것을 알아 냈다. 줌/바운싱 애니메이션 속도를 늦추지 않고 속도가 빠르고 유동적 인 간단한 방법을 찾았습니다.

Quartz에는 CAShapeLayer라는 클래스가있어 매우 멋진 기능을 수행 할 수 있습니다. 이 중 CGPath 속성을 설정하고 선 두께를 지정할 수 있습니다. 변경 사항이보기에 반영됩니다.

그래서 기본적으로 내 scrollViewDidZoom 메서드에서 shapeLayer.lineWidth를 호출하고 정확하게 필요한 것을 수행합니다.

+0

감사.나는 CGPath를 그리기 위해 이것을 따르고 선이 안개를 발생시키지 않도록 줌아웃한다. 그러나, 나는 다른 색상과 lineWidth로 그려진 CGPath의 숫자를 가지고있다. 그런 다음 각 CGPath에 대해 각각 새로운 CAShapeLayer를 할당 한 다음 각 레이어를 뷰의 레이어 subLayer로 추가해야합니다. 너무 많은 하위 레이어를 추가하면 성능 문제가 발생합니까? 어쩌면 내가 걱정할 것 같아. – Yeung

+0

예. 결국 드로잉은 iPhone 4와 같은 구형 장치에서 느려지므로 조심하십시오. 경로가 얼마나 큰지에 달려 있습니다. 라인 세그먼트가 몇 개인 경우 문제가되지 않습니다. – Imran

1

확대/축소 중에 기본 확대/축소 비헤이비어를 사용하는 것입니다. (다시 그리기는하지 않지만 GPU가 매우 빠르게 수행 할 수있는 확대/축소 된보기에 변형을 적용하는 것이지만 당신이주의했듯이 열등한 품질로 이어질 수 있음).

사용자가 확대/축소를 마쳤 으면 이제 전체보기를 다시 그립니다. 적절한 대리자 메서드는 scrollViewDidEndZooming:withView:atScale:입니다.

이렇게하면 줌이 끝난 후 빠르게 (그러나 약간 못 생겼을 때) 확대/축소되고 멋진 (그러나 약간은 눈에 띄지 않지만 느리게) 표시가됩니다.

+0

안녕하세요 fzwo이 옵션을 시도하고 작동하지만 여전히 조금 이상하게 보입니다. – Imran

+0

그것도 나쁘지 않아 만약 내가 (--_zoomScale * 10) + 20과 같은 음의 선형 그래디언트로 뭔가 내 라인 두께 계산을 변경합니다. 그게 대체 속도 계획은 추측하지만 그 줄 두께의 변화는 여전히 눈에 띄는 것 같아요. – Imran

+0

성능 제한으로 인해 실시간으로 선 두께를 변경할 수없는 경우 선 두께 변경이 눈에 띄게 표시되지 않습니다. 당신이 멋져지기를 원한다면, 스크롤의 끝에서, 오래된 변형 된 것과 새로운 멋지게 렌더링 된 뷰 사이를 사라지게하여 점프를 덜 분명하게 만듭니다. – fzwo

관련 문제