1

traitCollectionDidChange(_)을 무시하고 컴팩트하고 규칙적인 제약 조건을 업데이트합니다. 제약 조건을 회전하여 장치에서이를 테스트 할 때 올바르게 업데이트됩니다. 그러나 시뮬레이터에서 동일한 코드를 테스트하려고하면 아무 일도 일어나지 않습니다. print 문을 사용하여 시뮬레이터 회전시 아무 것도 발생하지 않는다는 것을 알 수 있습니다. 이 버그입니까, 아니면 시뮬레이터를 위해 특별한 것을해야합니까?Xcode 시뮬레이터가 traitCollectionDidChange를 호출하지 않습니다.

미리 감사드립니다. 나는 Xcode 8.2.1 btw를 사용하고있다. hoshy의 질문에 따라

[launch app] 
`going to activate: compact` 
[rotate the simulator with ⌘ arrow key] 
`going to activate: compact` 

작은 갱신 :

다음과
private var compactConstraints: [NSLayoutConstraint] = [] 
    private var regularConstraints: [NSLayoutConstraint] = [] 
    private var sharedConstraints: [NSLayoutConstraint] = [] 
    ... 
    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { 

     super.traitCollectionDidChange(previousTraitCollection) 

     if (!sharedConstraints[0].isActive) { 
      // activating shared constraints 
      NSLayoutConstraint.activate(sharedConstraints) 
     } 


     if (self.traitCollection.containsTraits(in: UITraitCollection(horizontalSizeClass: UIUserInterfaceSizeClass.compact))) { 

      print("going to activate: compact") 
      if regularConstraints.count > 0 && regularConstraints[0].isActive { 
       NSLayoutConstraint.deactivate(regularConstraints) 
      } 
      // activating compact constraints 
      NSLayoutConstraint.activate(compactConstraints) 
     } else { 
      print("going to activate: regular") 
      if compactConstraints.count > 0 && compactConstraints[0].isActive { 
       NSLayoutConstraint.deactivate(compactConstraints) 
      } 
      // activating regular constraints 
      NSLayoutConstraint.activate(regularConstraints) 
     } 

    } 

콘솔 출력 될 때 :

이 내 코드입니다 을 나는 아이폰 장치와 시뮬레이터를 사용하고 있습니다. 특히 iPhone SE.

답변

0

horizontalSizeClass은 두 방향 모두에 대해 Compact입니다. verticalSizeClassportrait의 경우 regular이고 iPhone SE의 경우 landscape의 경우 Compact입니다. 이 라인을 변경할 수 있습니다

if (traitCollection.containsTraits(in: UITraitCollection(verticalSizeClass: .compact))) { 

또는


당신이 크기 변경 애니메이션과 함께 실행하는 애니메이션을 찾고 있다면 당신은 또한 viewWillTransitionToSize:withTransitionCoordinator:을 사용할 수 있습니다 단순히

if traitCollection.verticalSizeClass == .compact { 
. 당신이 원하는 당신의 자동 레이아웃 제약 모양을 달성하기에 충분하지 않은 경우

사과 개발자로부터

Building an Adaptive Interface, 당신은 당신의 레이아웃 변경하려면 viewWillTransitionToSize:withTransitionCoordinator: 방법을 사용할 수 있습니다. 이 방법을 사용하여 크기 변경 애니메이션과 함께 실행되는 추가 애니메이션을 만들 수도 있습니다. 예제의 경우 인터페이스 순환 중에 코디네이터의 targetTransform 속성을 사용하여 인터페이스의 일부에 대해 역방향 축 행렬을 만들 수 있습니다.

+0

감사합니다. :-) if-else 문을 수정하여 vertical 및 horizontalSizeClasses를 모두 확인했습니다. 그렇게하면 iPads를 더 잘 다룰 수 있습니다. – Joseph

0

실제 테스트 장치가 iPhone이고 시뮬레이터가 iPad 일 수 있습니까? TraitCollectionDidChange 메서드는 두 방향이 모두 '보통'이므로 후자에 대해서는 호출되지 않습니다.

+0

시뮬레이터 장치로 iPhone SE를 선택했습니다. – Joseph