2012-01-05 2 views
3

뷰를 프로그래밍 방식으로 관리하는 방법에 대한 자세한 설명을보고 싶습니다. 나는 지금 어떻게하고 있는지에 대한 개요를 제공 할 것이고, 내 접근 방식이 얼마나 짜증나는 지에 대한 의견이나 깨끗하고 올바르게 수행하는 방법에 대한 간단한 설명을 원할 것이다.뷰와 컨트롤러를 프로그래밍 방식으로 추가 및 제거하는 가장 좋은 방법은 무엇입니까?

기본적으로 내 앱의 기본보기 컨트롤러의 loadView 방법에서 루트보기를 만들고 self.view을 설정합니다. 내가 컨트롤러, 말, 표시되는 첫 번째를 첨부 할 때, 나는이 방법 전화 : 내가 명시 적으로 viewWillAppear 전화

-(void) attachViewForController:(UIViewController*)controller 
{ 
    [self.mRootView addSubview:controller.view]; 
    [controller viewWillAppear:NO];  
} 

공지 사항 (나는 그것이 자동으로 호출되지 않은 생각), 내가 수동으로 수행 할 경우 뷰를 가져올 애니메이션 (슬라이딩 인, 페이드 인 등). 이 접근법에 이상하거나 이상한 점이 있습니까? 나는이보기를 떠나 다른로 전환 할 때

지금, 내가 설정하는 방법을 스위치 전화

:

-(void) setControllerSwitch:(UIViewController*)outgoingController 
    incomingController:(UIViewController*)incomingController 
    delay:(float)delay; 
{ 
    self.mOutgoingController = outgoingController; 
    self.mIncomingController = incomingController; 
    self.mSwitchControllerTimer = [NSTimer scheduledTimerWithTimeInterval:delay target:self selector:@selector(switchControllerCallback) userInfo:nil repeats:NO]; 

} 

시간이 순간, 나는 발신의 종료 애니메이션을 시작했습니다 이 메서드는 컨트롤러를 기록하고 나가는 뷰가 애니메이션 처리 된 순간에 실제 전환을 수행 할 메서드를 예약합니다. 이와 같이 :

-(void) switchControllerCallback 
{ 
    self.mSwitchControllerTimer = nil; 

    // remove outgoing view 
    [mOutgoingController.view removeFromSuperview]; 

    // add incoming view 
    [self attachViewForController:mIncomingController]; 
} 

이것은 관리하기에 알맞은 방법입니까? 몇 가지 포인트 :

  1. 가 나는 경우 나가는 컨트롤러 애니메이션의 끝을 트리거를 설정하는 대신 콜백을 아마 수 알지만, 그냥 날 페이드보기를 교차 할 수 있도록 공간을 확보하기 위해 명시 적으로 지연 PARAM을 통해 작업을 수행하는 선택 . 그러나 초기에 setControllerSwitch이라고 부르는 것은 실제로 이전 컨트롤러를 쓸모 없게 만들고 애니메이션을 잘라 버리기 때문에 사실 크로스 페이딩을 허용하지 않을 수도 있습니다.

  2. 앞에서 언급했듯이 viewWillAppear을 명시 적으로 호출하면 아니요 아니요,보기 흐름을 관리하는 더 적절한 방법이 있는지 궁금합니다.

+0

뷰 컨트롤러의 기본 제공 푸시 및 팝핑을 사용하는 대신 자신의보기 컨트롤러 탐색을 수동으로 구현하는 이유가 있습니까? –

답변

1

Apple 개발자 설명서에서 복사되었지만보기 및 여러보기 관리에 대해 많이 이해할 수 있습니다. 보기 사용에 대한

팁 효과적으로

사용자 지정보기는 표준 시스템 뷰를 제공하지 않는 무언가를 그릴 필요 상황에 유용하지만, 당신의 전망의 성능이 좋다는 것을 확인하는 것은 귀하의 책임입니다 충분히. UIKit은 뷰 관련 동작을 최적화하고 사용자 정의 뷰에서 우수한 성능을 얻을 수 있도록 모든 작업을 수행합니다. 그러나 다음 팁을 고려하여이 측면에서 UIKit을 도울 수 있습니다.

뷰는 항상 응용 프로그램의 개별 뷰와 뷰 컨트롤러 사이에 일대일 관계가 거의 없다 해당보기 컨트롤러

이 없습니다. 뷰 컨트롤러의 역할은 뷰 계층 구조를 관리하는 것입니다. 뷰 계층 구조는 종종 자체 포함 된 기능을 구현하는 데 사용되는 둘 이상의보기로 구성됩니다. iPhone 응용 프로그램의 경우 일반적으로 각보기 계층 구조가 전체 화면을 채 웁니다. iPad 응용 프로그램의 경우보기 계층 구조가 화면의 일부만 채울 수 있습니다.

응용 프로그램의 사용자 인터페이스를 디자인 할 때보기 컨트롤러가 수행 할 역할을 고려하는 것이 중요합니다. View Controller는 화면에서의 화면 표시 조정, 화면에서보기의 제거 조정, 메모리 부족 경고에 대한 응답으로 메모리 해제 및 인터페이스 방향 변경에 대한보기 회전과 같은 많은 중요한 동작을 제공합니다. 이러한 비헤이비어를 우회하면 응용 프로그램이 잘못되거나 예기치 않은 방식으로 작동 할 수 있습니다.

컨트롤러 및 응용 프로그램에서의 역할보기에 대한 자세한 내용은 iOS 용 Controller Programming Guide보기를 참조하십시오. 사용자 정의 그리기가 항상 필요하지만

사용자 지정 그리기

최소화, 또한 가능한 한 피해야 당신이 무언가이다. 기존의 시스템 뷰 클래스가 필요한 모양이나 기능을 제공하지 않는 경우에만 사용자 지정 그리기를 수행해야합니다. 콘텐츠를 기존보기의 조합으로 조합 할 수 있으면 언제든지 해당보기 개체를 사용자 지정보기 계층 구조로 결합하는 것이 가장 좋습니다.

시간을 최소화 내용 모드

내용 모드의 장점을 가지고 귀하의 의견을 다시 그리는 보냈다. 기본적으로 뷰는 UIViewContentModeScaleToFill 콘텐츠 모드를 사용하며 뷰의 프레임 사각형에 맞게보기의 기존 내용을 조정합니다. 가능한 경우이 모드를 변경하여 내용을 다르게 조정할 수 있지만 가능한 경우 UIViewContentModeRedraw 콘텐츠 모드를 사용하지 않아야합니다. 적용되는 컨텐츠 모드에 관계없이 항상 setNeedsDisplay 또는 setNeedsDisplayInRect :를 호출하여 뷰의 내용을 다시 그릴 수 있습니다. 가능한

UIKit은보기 합성 작업을 최적화 할 수 있는지 여부를 결정하기 위해 각보기의 불투명 속성을 사용 할 때마다

불투명으로 조회수를 선언합니다. 사용자 지정보기에 대해이 속성의 값을 YES로 설정하면 UIKit에서보기 뒤에 아무 내용도 렌더링 할 필요가 없음을 알립니다. 렌더링이 적 으면 드로잉 코드의 성능이 향상 될 수 있으며 일반적으로 권장됩니다. 물론, 불투명 속성을 YES로 설정하면보기가 완전히 불투명 한 내용으로 경계 사각형을 완전히 채워야합니다.

을 스크롤 할 때

는 스크롤 짧은 시간에 많은보기 업데이트를 부과 할 수 있습니다보기의 드로잉 동작을 조정합니다. 보기의 그리기 코드가 적절히 조정되지 않으면보기 성능이 느려질 수 있습니다. 보기의 내용이 항상 초기 상태인지 확인하기보다는 스크롤 작업이 시작될 때보기의 동작을 변경하는 것이 좋습니다. 예를 들어 스크롤이 진행되는 동안 렌더링 된 콘텐트의 품질을 일시적으로 낮추거나 콘텐트 모드를 변경할 수 있습니다. 스크롤이 멈 추면 뷰를 이전 상태로 되돌리고 필요에 따라 내용을 업데이트 할 수 있습니다. 이 상속 표준 시스템 컨트롤-객체에 하위 뷰를 추가하는 것은 기술적으로 가능하지만

이 서브 뷰

을 포함시켜 제어를 정의하지 마십시오 UIControl -이 방식으로 정의해서는 안됩니다. 커스터마이징을 지원하는 컨트롤은 컨트롤 클래스 자체의 명확하고 잘 문서화 된 인터페이스를 통해 그렇게합니다. 예를 들어 UIButton 클래스에는 단추의 제목 및 배경 이미지를 설정하는 메서드가 포함되어 있습니다.정의 된 사용자 정의 포인트를 사용하면 코드가 항상 올바르게 작동합니다. 버튼 내부에 맞춤 이미지 뷰 또는 라벨을 포함시킴으로써 이러한 메소드를 우회하여 버튼의 구현이 변경되면 애플리케이션이 현재 또는 나중에 어느 시점에서 잘못 작동 할 수 있습니다.

관련 문제