2011-03-23 4 views
1

그래서 난 내 응용 프로그램의 회전을 설정하고, 나는 수동으로 다음과 같은 방법을 사용하여 버튼의 번역을 모두 설정되었습니다두 펜촉, 같은 객체 (아이폰)

-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)x 
            duration:(NSTimeInterval)duration{ 

CGRect bounds = [[self view] bounds]; 

if (UIInterfaceOrientationIsPortrait(x)) { 
    [anObject setFrame: CGRectMake(0, 0, bounds.size.width, 194)]; 
} 
else { 
    [anObject setFrame: CGRectMake(0, 0, bounds.size.width, 110)]; 
} 

} 

I가 각각 설정하고있어를 두 방향 모두에서 대상의 위치. 내 목표를 달성하는 끔찍한 방법 같아요.

이제 주전 펜촉을 복사하고 새 펜촉의 모든 버튼 위치를 설정하십시오. 그런 다음 장치가 회전하면 해당 펜촉을 호출하십시오. 그럴 가능성은/실현 가능/할 수있는 좋은 방법인가?

회전을 위해 펜촉을 어떻게 부르겠습니까? 동일한 IB 연결에 정확히 같은 물체를 사용할 수 있습니까?

더 좋은 방법이 있습니까?

+0

나는 이것이 좋은 생각이라고 생각하지 않습니다. 회전시 뷰를로드하는 것은 서브 뷰의 프레임을 변경하는 오버 헤드가 많습니다. 내가 자주하는 일은 IB에서 Portrait의 버튼을 레이아웃 한 다음 IB의보기를 Landscape로 변경하고 레이아웃/늘이기 옵션 만 사용하여 버튼의 크기를 조정하거나 맞출 수 있는지 확인하는 것입니다. – NWCoder

+0

레이아웃 옵션을 시도했습니다 ... 불행히도 구성은 필요한 정의로 변경됩니다. – ultifinitus

답변

3

필자는 필요한 동작에 따라 두 가지 접근 방식을 사용했습니다. 어떤 것이 가장 적합한 지 확인하십시오.

  1. 당신은 autoresizingMaskautoresizesSubviews를 사용하여 두 방향을 지원할 수 있도록하는 일련의 규칙을 찾아보십시오.

  2. 부모보기의 -layoutSubviews에 대한 규칙 집합을 찾아 하위보기를 부모보기의 경계를 기준으로 재 배열 할 수 있도록하십시오. 이는 자동 크기 조정보다 많은 작업이지만 모든 하위보기에 대해 두 개의 하드 코딩 된 위치보다 좋습니다. 이를 위해서는 종종 다른보기를 중첩시켜 다른 -layoutSubviews 동작이있는 여러보기를 중첩시켜 가시적 인 하위보기 주위에 적절한 위치를 지정하고 간격을 좁히는 깊은보기 계층을 만들어야합니다.

  3. 각 방향에 대해 하나씩 두 개의 하위보기가 있습니다. 회전 할 때 감추십시오. 이렇게하면 새 펜촉을로드하고 루트보기를 바꾸면 얻을 수없는 하위보기간에 사용자 정의 전환이 가능합니다. 각 하위 뷰를 자신의 펜촉으로로드하면 메모리 사용을 줄이기 위해 더 이상 보이지 않는 것을 언로드 할 수 있습니다. 그런 다음 두 뷰가 동일한 상태를 표시하고 동일한 IBActions를 트리거하며 여분의 IBOutlet 참조를 갖거나 (또는 ​​새 NB에서 새 하위 뷰를로드하여 리 바인드하기 전에 현재 IBOutlet의 상태를 신중하게 캡처해야 함) 속성을 설정할 수 있어야합니다. 각 회전에서 동일한 뷰.

  4. 위의 옵션 2와 3을 결합하여 각 회전마다 서로 다른 레이아웃 동작을 사용하여 서로 다른보기를로드하고 하위보기를 서로주고받습니다.

+0

댕! 더 쉬운 방법이있을 거라 생각 했어! 응답 주셔서 감사합니다! – ultifinitus

1

이 방법은 Apple의 명명 규칙을 사용하는 2 개의 NIB입니다. 필자는 iOS 6 또는 7에서 Apple이이를 "기능"으로 추가 할 것으로 생각합니다. 내 애플 리케이션에서 그것을 사용하고 있는데 그것은 완벽하게 작동합니다 :

  1. 는 (회전의 ANIM을 시작하려고 할 때까지 기다립니다)
  2. 가로/세로 파일 (기본값에 대한 애플의 명명 규칙을 사용하여 회전합니다에 트리거합니다. Apple이 가로 방향 버전을 자동으로로드하게하려면 png가 Default-landscape.png입니다.
  3. 은 새 NIB
  4. 을 다시로드합니다.보기 -

(NB stackoverflow.com 여기이 문장을 필요로 (수동으로 NIB를 다시로드하면 애플은 사용자를 위해이 호출되지 않습니다)이 자동으로

  • 표시를 업데이트 한 후이있는 viewDidLoad가 호출 -있다 코드 포맷터의 버그)

    -(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
    { 
        if(UIInterfaceOrientationIsLandscape(toInterfaceOrientation)) 
        { 
         [[NSBundle mainBundle] loadNibNamed:[NSString stringWithFormat:@"%@-landscape", NSStringFromClass([self class])] owner:self options:nil]; 
    
         [self viewDidLoad]; 
        } 
        else 
        { 
         [[NSBundle mainBundle] loadNibNamed:[NSString stringWithFormat:@"%@", NSStringFromClass([self class])] owner:self options:nil]; 
    
         [self viewDidLoad]; 
        } 
    }