2015-02-01 2 views
10

스토리 보드에서 자동 레이아웃을 사용하는 경우 제약 조건을 설치하거나 '설치됨'확인란을 사용하지 않을 수 있습니다. 이것을 비활성화하면 제약 조건을 추가하지 않은 것처럼 행동하게됩니다. 아무런 효과가 없습니다. Interface Builder에서 다른 크기 클래스에 대해 설치된 상태를 구성 할 수 있으며 active 속성을 true 또는 false으로 설정하여이 값을 프로그래밍 방식으로 변경할 수 있습니다.자동 레이아웃 제약 조건을 위해 "installed"를 바꿀 위치는 어디입니까?

내 응용 프로그램에서 장치가 세로 방향 인 동안에 만 구속 조건을 설치하고 싶습니다. 가로 방향으로 회전 할 때 "제거"해야합니다. 이것은 Any Width Compact Height 용으로 설치된 장치의 선택을 취소하여 iPhone 용으로 수행 할 수 있습니다. (그러나 이것은 설치가되어서는 안되는 풍경으로 회전 할 때 상충되는 제약으로 인해이 제약 조건이 깨지기 때문에 제대로 작동하지 않지만 UI는 항상 예상대로 나타납니다.) 그러나 제거 할 방법은 없습니다 인터페이스 빌더에서 iPad의 풍경에 대한 제약 (두 방향의 일반 너비 일반 높이).

기기를 회전 할 때 NSLayoutConstraintactive을 활성화/비활성화 할 수있는 적절한 위치는 어디입니까? 어떤 회전 방식으로 상태가 원하는 동작으로 바뀌고 세로 방향으로 만 설치됩니까? 앱 실행시 해당 메소드가 호출되지 않으면 순환 메소드 이외에 다른 메소드를 배치해야합니까?

내가 viewDidLoadviewWillTransitionToSize에 다음 코드를 삽입하려고했지만 아이 패드에서 실행 때 일부 예기치 않은 동작이 결과 :

  • 풍경에 응용 프로그램을 시작 제약 조건이 활성 사실에도 불구하고 활성화됩니다 false로 설정하면 제약 조건이 깨지고 예상대로 UI가 표시되지 않습니다.
  • 앱을 세로로 설정하면 (예 : IB에 이미 설치되어 있으므로) 예상대로 작동합니다.
  • 앱 실행 초상화에서 그리고 회전 장치가 가로로 예상대로 작동 함 - 제약 조건이 비활성으로 설정되고 제약 조건을 위반하지 않고 UI가 예상대로 나타남
  • 앱을 세로 방향으로 시작하고 가로 방향으로 회전하고 세로 방향으로 돌아 가면 UI가 올바르게 표시되지만

인터페이스 작성기에서 제약 조건을 제거한 다음 위의 시나리오를 실행하면 본질적으로 반대되는 동작이 발생합니다.

if size.width > size.height { 
    self.myConstraint.active = false 
} else { 
    self.myConstraint.active = true 
} 

답변

0

는 내가 아이폰 OS 7 아이폰 컴팩트 폭/컴팩트 높이를 감지하는 자동 레이아웃의 무능력의 문제를 해결하기 위해 비슷한 문제에 직면했을 때 여기에 대한 답변을 늦게하지만 조금 내 2 센트입니다. iOS 7에는 activated 속성이 없으므로 추가/제거해야했습니다.

제약 조건을 추가 및 제거하는 두 가지 방법을 만들었으며 이러한 제약 조건은 이미 IB에 설정되어 있으며이를 IBOutlet 속성으로 참조합니다. 따라서 다른 IB 객체와 달리 객체를 제거한 이후 weak이 아닌 strong으로 설정해야합니다. 그렇지 않으면, 내가 그들을 제거하고 나면 그들은 파괴 될 것이고, 나는 그들을 다시 추가하기 위해 그들을 다시 참조 할 수 없을 것이다.여기

내 제약 제거 방법입니다 :

-(void)removeiOS7andiPhone4inLandscapeToOrientation:(UIInterfaceOrientation)toInterfaceOrientation{ 

    if(!UIInterfaceOrientationIsLandscape(toInterfaceOrientation)&&(NSFoundationVersionNumber<=NSFoundationVersionNumber_iOS_7_1)&&(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)){ 
     // if iPhone with iOS 7 on portrait remove Constraints here 

    } 
} 

여기 제약 가산 방법 : 당신이 시도로, 그들 모두를 호출,이 메소드를 호출하는 위치에 관해서는

-(void)addiOS7andiPhone4inLandscapeToOrientation:(UIInterfaceOrientation)toInterfaceOrientation{ 

    if(UIInterfaceOrientationIsLandscape(toInterfaceOrientation)&&(NSFoundationVersionNumber<=NSFoundationVersionNumber_iOS_7_1)&&(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)){ 
     // if iPhone with iOS 7 on landscape add Constraints here 

    } 

} 

viewWillAppear (viewWillDisappear을 호출 할 필요가 없음) 및 viewWillTransitionToSize (내 경우, viewWillTransitionToSize은 iOS 8 이후에만 사용 가능하므로 willRotateToInterfaceOrientation입니다). 이후에 전화를 걸면 나중에 필요한 변경을하기 전에 세로/가로 방향을 if (으)로 확인하기 때문에 단 하나만 실행됩니다.

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{ 

    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; 

    // this will be run only if orientation is on Portrait 
    [self addiOS7andiPhone4inLandscapeToOrientation:toInterfaceOrientation]; 

    // this will be run only if orientation is on Landscape 
    [self removeiOS7andiPhone4inLandscapeToOrientation:toInterfaceOrientation]; 
} 

viewWillAppear에서 비슷한 전화를 걸 : 여기

및 내 willRotateToInterfaceOrientation 방법 정의입니다.

공지 사항 :이 방법에서는 정반대로 작업해야하며 반드시 addConstraintMethod에서만 제약 조건을 추가하고 removeConstraintMethod에서만 제거하지 않는지 확인하십시오. 필자의 경우에는 각각에 제약 조건을 추가하고 제거하므로 메서드의 명명법이 해당 메서드의 실제 역할에 정확히 반영되지는 않지만 정확한 정반대의 작업을 수행하는 한 좋은 결과를 얻을 수 있습니다.

관련 문제