그리기 또는 하위 보기를 위해 iOS의 컨트롤과 같은 간트 차트를 만들어야 합니까?

StackOverflow https://stackoverflow.com//questions/22001895

문제

내 앱에 대한 iOS의 컨트롤과 같은 Gantt 차트를 만들 준비가 되었습니다.이벤트의 타임라인을 보여줘야 합니다.기본적으로 여러 개의 직사각형, 일부 장식용 선/호, 속성 편집을 위한 한두 개의 터치 포인트 등이 있습니다.기본적으로 내 휴대폰에서는 "전체 화면" 컨트롤이 됩니다.

이 사용자 정의 UIView 하위 클래스를 구현하는 두 가지 기본 경로가 있습니다.

  1. 간단히 구현 drawRect: 그리고 다음을 이용해서 마을로 가세요 CoreGraphics 전화.모든 그리기 작업을 수행하는 여러 개인 메서드로 분할될 가능성이 높습니다.하위 지역 적중 감지에 도움이 되도록 필요에 따라 일부 정보를 캐시할 수도 있습니다.

  2. 그래픽을 "그리는" 대신 다음을 사용하여 여러 UIView를 자식으로 추가합니다. addSubview: 그리고 그들의 조작 layer 다양한 그래픽 부분을 표시하도록 하는 속성 bounds\frame 적절하게 배치되도록 합니다.그런 다음 "그림 그리기"가 알아서 처리되도록 놔두세요.

한 경로가 다른 경로보다 나은가요?장기적으로는 두 가지를 모두 시도하게 될 수도 있지만, 먼저 먼저 가본 사람들의 지혜를 구해야겠다고 생각했습니다.

나의 추측하다 그거야? 더 빨리 해결책은 drawRect: 경로 및 하위 뷰 접근 방식에는 더 많은 코드가 필요하지만 더 강력할 수도 있습니다(보다 쉬운 적중 감지, 애니메이션 지원, 자동 클리핑 관리 등).나는 구현할 수 있기를 원한다 핀치하여 확대/축소 등등, 장기적으로요.

업데이트

나는 ~와 함께 갔다 UICollectionView 접근하다.덕분에 무료로 선택하고 스크롤할 수 있게 되었습니다(놀라운 일이 있었지만).나는 지금까지의 결과에 꽤 만족했습니다.

도움이 되었습니까?

해결책

코어 그래프와 함께가는 것은 UIViews를 구축하는 것보다 많은 코드 라인을 쓸 것입니다.그러나 해당 모든 콘텐츠를 관리하기위한보다 견고한 솔루션이 필요할 것입니다.UICollectionView는 사용자 정의 UICollectionViewCell 서브 클래스로보기에 데이터를 맵핑하기위한 적절한 솔루션과 같습니다.이것은 당신 자신의 롤링보다 훨씬 더 빨리 개발할 것이며, UICollectionViewLayout 서브 클래스를 통해 큰 유연성을 제공합니다.colog to zoom to zoom이 상자에서 펼쳐지는 것은 아니지만 할 수있는 방법이 있습니다. .이것은 셀 재사용으로 인해 UIViews의 무리를 사용하는 것보다 메모리에도 더 좋지만 모든 크기가 계산 될 크기가 다른 수백 개의 항목이 느려질 수 있습니다.

다른 팁

성능에 관해서는 잘 쓰여졌습니다. drawRect: 특히 잠재적으로 많은 직사각형을 렌더링해야 할 때 선호됩니다.뷰를 사용하면 전체 레이아웃 시스템이 작동하게 됩니다. 전체 레이아웃 시스템이 도시로 이동하여 성능을 저하시키는 자동 레이아웃이 있는 경우에는 훨씬 더 나쁩니다.최근 성능상의 이유로 달력 보기를 보기 기반에서 CG 기반으로 업그레이드했습니다.

물론 다른 모든 측면에서는 뷰를 사용하여 작업하는 것이 훨씬 더 선호됩니다.Interface Builder, 간편한 제스처 인식기 설정, OO 등여전히 각 요소에 대한 논리적 클래스를 생성하고 현재 컨텍스트에서 자체적으로 그리도록 할 수 있지만(컨텍스트 참조를 전달하고 그에 따라 그리는 것이 가장 좋음) 여전히 간단하지는 않습니다.

최신 장치에서는 뷰 그리기 성능이 실제로 상당히 높습니다.하지만 iPhone 4 및 4S 장치를 원한다면, GPU 성능이 상당히 부족한 iPad 3 장치를 원한다면, 그래프의 잠재적 크기에 따라 CG 방식으로 가야 할 수도 있습니다.

이제 핀치로 확대/축소를 언급하셨습니다.이건 무슨 일이 있어도 개년이야.당신이 당신의 글을 쓰면 drawRect: 글쎄, 당신은 결국 타일링 작업을 수행하고 작업할 수 있습니다.

사용자가 차트의 일부를 이동시키는 계획을 세우는 경우 나는 확실히 견해를 가지고가는 것이 좋습니다.

fyi, 핀치를 처리하여 삭제로 줌으로 확대 할 수 있습니다.

이 경우에 UIView를 사용하는 것은 차트의 전환 애니메이션을 지원하고 차트의 요소를 탭하는 차트의 일부를 끌고 차트의 전환을 지원하는 것입니다 (DrawRect : DrawRect :)은 너무 어렵지는 않습니다. 또한 CPU 사용량이 무거운 CPU 사용량이 필요한 차트에 요소가있는 경우 렌더링 요소의 렌더링이 레이어에 캐시되어 있기 때문에 UIView의 차트의 하위 부분을 다시 그릴 필요가 있으면 성능이 향상됩니다. 당신이 걱정하는 조각들을 다시 그릴 수있는 조각들을 다시 그릴 수 있습니다.

차트가 매우 크고 DrawRect를 사용하려는 경우 : 백업을 위해 CatileLayer를 사용하여 메모리에 전체 레이어가 없도록하십시오. 전체 영역이 아닌 요청 된 타일을 렌더링하고 싶을 경우 추가 된 문제가 추가 될 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top