2011-04-06 3 views
1

나는 그 안에 그릴 수있는 UIView를 서브 클래스 화해야한다는 것을 이해했습니다.
아직 이해가 안되는 점은 내가해야만하는 철학입니다 ...아이폰 - 뷰로 그리기 : 철학과 상호 작용

내가보기 컨트롤러를 가지고 있고 컨텍스트에 따라 하나의 선을 그릴 수 있습니다. 그것이 관리하는 하위 뷰 또는 원 또는 직사각형, 또는 처리 된 그래픽. 또는 뷰 내부에서 정의 된 rect로 이동하는 두 지점을 말하고 닫을 때 더 큰 지점을 표시합니다.

하위 뷰를 정의하여 drawRect 메서드에서만이 작업을 수행 할 수 있도록하려면 어떻게해야합니까?

이 간단한 UIView 이상을 관리하는 컨트롤러 인 은 어떻게됩니까? (다른보기가 많은보기를 관리하는보기 컨트롤러가 있고 그 중 두 개에서 일부 그림을 만들고 싶다고 가정 해 봅시다) , 그리고 그것은 올바른 뷰 (컨트롤러가 아닌가?)에 끌어 들여야하는 것을 알고, 뷰와 상호 작용할 수 있습니까? 그리기가 끝나면보기가 컨트롤러와 어떻게 상호 작용할 수 있습니까?

드로잉 (사과, 웹, 포럼, 자습서, ...)에 대한 많은 문서를 읽었지만 여전히 수행해야 할 방식에 대한 철학을 다룰 수는 없습니다.

답변

5

매우 간단합니다. 새 클래스 인 OliverView를 UIView로 만듭니다. (즉, UIView의 하위 클래스입니다.)이보기에서는 공상 방식으로 내용을 그려 넣으십시오 (drawRect 내부).

이제 OliverVC라는 UIViewController를 만듭니다. 스토리 보드에서 OliverView를 OliverVC에 넣습니다. (beginner explanation of how to do that).

OliverView에는 "시간", "분", "초"속성이 있습니다.

이제 OliverView - drawRect에서 - 디스플레이에 대한 멋진 방법이 있습니다. 이러한 값입니다. (원형 차트, 빛나는 글자, 애니메이션 - 원하는대로)

이제 OliverVC에서 짐바브웨의 시간을 확인하기 위해 몇 가지 계산을 수행하십시오.

시간이 표시되면 은 OliverView에서 이러한 속성을 설정하기 만하면됩니다.

동료가 OliverView를 프로그래밍 할 수 있습니다. 그녀가 어떻게 시간을 표시 할 것인지에 대해 알 필요가 없습니다. 반대로 동료는 올리버 VC에서 계산에 대해 알 필요가 없습니다.

그래서 간단합니다. 한 부분에 데이터를 표시하는 작업이 있습니다. 한 부분은 데이터와 함께 떠오르는 일을합니다 (앱에서 어떤 계산이든 상관 없습니다).

보기가 언제든지 변경 될 수있는 "실시간"화면 장치에서 가능한 유일한 아키텍처입니다.


아래 질문에 대한 답변으로, 완전히 분리 된 요소가 될 단추가있는 경우 매우 간단하게 잊어 버린 것입니다. (아마도 올리버 뷰의 "꼭대기에 앉아"있을 것입니다.) 그래서, 그것은 쉽습니다!

+0

매우 유용하고 유용한 답변 +1. 나는 커스텀 뷰를 작성하기 시작할 때 스스로 문제가 있다는 것을 알고있다. 일단 당신이 그것을 얻으면 그것은 모두 의미가 있습니다. – GorillaPatch

+1

예! 특히이 질문이 이처럼 잘 제기되면. – GorillaPatch

+0

음, 역방향 상호 작용은 어떨까요? 내 사용자가 뷰가 알고있는 사용자 정의보기의 일부를 건 드리면 특정 (가능하면 전역) 조치가 수행되어야합니다. 그것은해야 할 일들을하기 위해 컨트롤러 (통제하려고하는)에게 어떻게 알리는가? – Oliver

2

UIView 하위 클래스의 -drawRect 메서드는 화면의 화면 모양을 정의합니다. 모든 그리기는 -drawRect에서 수행됩니다. UIViewController는 UIView에서 메서드를 호출하여 다르게 무언가를 그리거나 다른 동작을 수행하도록 지시합니다.

UIViewController는 본질적으로 콘텐츠 그림과 관련되지 않은보기로 수행 할 모든 작업을 관리합니다. 뷰와 연관된 데이터는 종종 컨트롤러에 저장됩니다.

+0

@voidzm : "보기와 관련된 데이터가 컨트롤러에 저장되는 경우가 많습니다." 뷰가 컨트롤러에있는 데이터에 어떻게 액세스 할 수 있으며 사용되는 것을 어떻게 알 수 있습니까? – Oliver

+0

예를 들어 문자열을 표시하는보기를 작성한다고 가정 해보십시오. 문자열은 일반적으로 컨트롤러에 저장되며 컨트롤러는 [[self view] setStringToDraw : string]을 호출합니다. UIView에 정의 된 문자열에 대한 인스턴스 변수 및 변경자가 있어야합니다. – voidzm

+0

@voidzm : 그래서 당신이 말하는 것은 내 UIView가 수십 개의 ivars를 필요할 때 필요할 때 사용할 수 있다는 것입니다. – Oliver