2015-02-02 1 views
0

지금까지 스토리 보드를 사용하여 UI를 개발했습니다. 이제 일부 UI 요소를 프로그래밍 방식으로 구성해야합니다. 예를 들어, 둥근 모서리 ..UI 코드는 어디에서 신속하게 입력해야합니까?

이 UI 코드를 viewDidLoad에 넣을 수는 있지만 올바른 해결책은 아닙니다. MVC 개념과 관련하여 컨트롤러는 뷰와 분리되어야합니다.

그래서 모든 UI 코드는 어디에 넣어야합니까? 모범 사례는 무엇입니까?

+0

나는 이것을 'viewDidLoad'에 넣었습니다. – Cesare

+0

하지만 MVC 디자인 패턴을 파괴하지는 않습니다 ... – Peter

+2

구성하려는 요소에 대해 고유 한 클래스를 만들고 뷰 구현에서 구성 할 수 있습니다. 예 : 둥근 모서리가있는'UIView'가 필요합니다. 그래서'JanView' ('UIView'의 자식)을 만들고'init ...'메소드에 둥근 모서리를 설정하십시오 –

답변

1

대부분의 경우 AutoLayout이 요소를 정렬하고 뷰에 올바르게 정렬 한 후에 발생하기 때문에 UI 코드를 viewDidLayoutSubviews 메서드에 넣을 수 있습니다. 예를 들어, viewDidLoad의 일부 코드는 Storyboard에서 제약 조건을 사용하면 제대로 작동하지 않습니다. ViewDidLoadAutoLayout 전에 실행되므로 코드에서이 값을 사용하면 높이와 너비가 모두 엉망이됩니다.

viewDidLayoutSubviews은 AutoLayout 이후에 실행되기 때문에 AutoLayout의 영향을 받았을 수있는 프레임 값을 사용하지 않는 한 거기에 넣는 것이 가장 좋습니다. 그러나 viewDidLayoutSubviews에 넣는 것이 좋습니다. 하지만이 방법은 특정 동작에 대해 여러 번 실행됩니다. 예를 들어 UITextField을 탭하면 다시 실행됩니다. 이는 성능에 좋지 않으며 불필요한 코드를 실행할 수 있으므로 문제가됩니다. 예를 들어, 텍스트 상자 아래에 특수 테두리를 추가 할 수 있습니다. 이를 위해 새 레이어를 만들고 높이와 너비를 사용하여 텍스트 상자에 레이어를 추가 할 수 있습니다. 프레임 속성을 사용하므로 높이와 너비가 AutoLayout에 의해 아직 설정되지 않았기 때문에 viewDidLoad에서 작동하지 않습니다. 이것은 viewDidLayoutSubviews에 넣어야한다는 것을 의미합니다. textField를 탭한 후에도 계속 호출 될 것입니다. 기본적으로 무제한의 테두리를 추가합니다.

이 성능 문제를 해결하려면 실제로는 UI 요소의 하위 클래스를 만들고 override drawRect 메서드에서 설정하는 것이 가장 좋습니다. 개체의 모든 속성에 액세스 할 수 있으므로 원하는 모든 것을 쉽게 설정할 수 있습니다. 그런 다음 스토리 보드 Identity Inspector에서 요소의 클래스를 하위 클래스로 변경합니다. 이렇게하면 요소가 생성되고 AutoLayout이 완료된 후에 Xcode가 자동으로 모든 작업을 수행 할 수 있으므로 UI를 사용자 정의하는 가장 좋은 방법이됩니다.

마지막으로 요소를 사용자 정의하는 또 다른 방법이 있습니다. Identity Inspector에서 User Defined Runtime Attributes로 이동하면 속성을 쉽게 추가하고 값을 편집 할 수 있습니다. 키 경로 (속성 이름)를 추가 한 다음 값 유형을 지정하고 추가하십시오! 이것은 쉽게 수행 할 수 있지만 좀 더 복잡한 속성의 경우 코드에서 수행하는 것이 더 쉽습니다.

하위 클래스를 지정하고 런타임 속성을 추가 할 수있는 위치를 보려면 아래 그림을 참조하십시오.

Customizing in Storyboard