'didRotateFromInterfaceOrientation'과 같은 회전 방법이 더 이상 사용되지 않습니까?


137

viewWillTransitionToSizeiOS 8에 도입 된 새로운 방법 을 구현하려고합니다 (다른 모든 회전 방법은 더 이상 사용되지 않습니다). didRotateFromInterfaceOrientation수행해야하는 정리 작업이 많고 UIViewControllerTransitionCoordinator새 항목으로 '전환'할 때 호출 할 수있는 블록을 볼 수 없으므로 해당 항목이 무엇인지 알고 싶습니다. 크기 마무리. 감사.

답변:


255

알았어 animateAlongsideTransition:completion:, 전달 된 메소드 를 사용해야합니다 UIViewControllerTransitionCoordinator.

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{   
    [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context)
    {
        UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
        // do whatever
    } completion:^(id<UIViewControllerTransitionCoordinatorContext> context)
    { 

    }];

    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
}

didRotateFromInterfaceOrientation처럼 회전 할 때마다이 메소드가 호출됩니까? 사용한 방법을 알려주세요. 감사합니다
ask123

2
그렇습니다. 이것은 내가하는 일입니다 : - (void) viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator { [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) { UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; // do whatever } completion:^(id<UIViewControllerTransitionCoordinatorContext> context) { }]; [super viewWillTransitionToSize: size withTransitionCoordinator: coordinator]; }
이상한

1
감사합니다-시간을 절약하기위한 답변으로 빠른 버전을 추가
하겠습니다

3
iOS 9에서는 statusbarorientation이 더 이상 사용되지 않습니다. 다른 옵션은 무엇입니까?
Deepak Sharma

1
@DeepakSharma 나는 파티에 조금 늦었지만 사용할 수 있습니다 [UIDevice currentDevice].orientation. UIDeviceOrientationIsPortrait([UIDevice currentDevice].orientation)또는 로 파이프 할 수도 있습니다 UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation). 도움이 되었기를 바랍니다!
Jeff

70

이상한 답변의 스위프트 버전

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {

    coordinator.animateAlongsideTransition({ (UIViewControllerTransitionCoordinatorContext) -> Void in

        let orient = UIApplication.sharedApplication().statusBarOrientation

        switch orient {
        case .Portrait:
            println("Portrait")
            // Do something
        default:
            println("Anything But Portrait")
            // Do something else
        }

        }, completion: { (UIViewControllerTransitionCoordinatorContext) -> Void in
            println("rotation completed")
    })

    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
}

ViewController에 넣었 기 때문에 이상 print합니다. 내 로그 에는 아무것도 없었습니다. 이 메소드가 호출되지 않기 때문에 추측합니다. 이것이 작동하기 위해 연결해야 할 다른 것을 생각할 수 있습니까?
트립

방금 빈 프로젝트 (Universal App)에 추가했으며 아무것도 추가하지 않아도 정상적으로 작동합니다. 아마도 메소드의 맨 처음에 로그 문을 넣고 그것이 호출되는지 확인하십시오. 추가해야 할 것은 생각 나지 않습니다. 어떤 iOS를 실행하고 있습니까?
DogCoffee

@ DogCoffee..its가 호출되지 않습니다. 시뮬레이터와 관련이 있습니까?
Saty

@Saty는 시뮬레이터에서도 작동합니다. 다시 확인하십시오. 예상대로 작동합니다.
DogCoffee

1
iOS 9에서는 statusbarorientation이 더 이상 사용되지 않습니다. 다른 옵션은 무엇입니까?
Deepak Sharma

10

iOS 10.3 및 스위프트 3

override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {

        coordinator.animate(alongsideTransition: { (_) in
            let orient = newCollection.verticalSizeClass

            switch orient {
            case .compact:
                print("Lanscape")///Excluding iPads!!!

            default:
                print("Portrait")
            }
        }, completion: { _ in
            print("rotation completed")
        })

        super.willTransition(to: newCollection, with: coordinator)
    }

왜 애니메이션이 필요한가요? 'newCollection'을 바로 확인할 수 없습니까?
cyanide

@cyanide와 애니메이션 동기화
Mike Glukhov

7

스위프트 3 에서 허용되는 답변 :

override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
    coordinator.animate(alongsideTransition: { (_) in
        let orient = UIApplication.shared.statusBarOrientation

        switch orient {
        case .portrait:
            print("Portrait")
        // Do something
        default:
            print("Anything But Portrait")
            // Do something else
        }
    }, completion: { (UIViewControllerTransitionCoordinatorContext) -> Void in
      print("rotation completed")
    })

    super.willTransition(to: newCollection, with: coordinator)
}

그것은 나를 위해 잘 작동합니다 👍


iOS 10에서는 작동하지 않습니다. 새로운 방향이 아닌 이전 방향을 인쇄합니다.
Vaddadi Kartick

1
@VaddadiKartick 당신이 사용해야하기 때문에let orient = newCollection.verticalSizeClass switch orient { case .compact: print("Lanscape") // Do something default: print("Portrait") // Do something else }
Mike Glukhov

5

문제는 다음과 같습니다. didRotateFromInterfaceOrientation

아래 코드를 작성한다고 생각했습니다.

@implementation ViewController
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
    [super traitCollectionDidChange:previousTraitCollection];
    if (previousTraitCollection.verticalSizeClass == UIUserInterfaceSizeClassRegular) {
        NSLog(@"User has rotated to landscape");
    } else if (previousTraitCollection.verticalSizeClass == UIUserInterfaceSizeClassCompact) {
        NSLog(@"User has rotated to portrait");
    }
}
@end

시뮬레이터에서 iPhone을 테스트했지만 traitsCollection이 변경되지 않기 때문에 iPad를 사용하여 테스트하면 인쇄 명령문이 실행되지 않습니다.

이것은 애플이 권장 하는 것이므로 이상 합니다 .

- (void) traitCollectionDidChange: (UITraitCollection *) previousTraitCollection {
    [super traitCollectionDidChange: previousTraitCollection];
    if ((self.traitCollection.verticalSizeClass != previousTraitCollection.verticalSizeClass)
        || self.traitCollection.horizontalSizeClass != previousTraitCollection.horizontalSizeClass)) {
        // your custom implementation here
    }
}

두 번째 코드에서 누락 된 브래킷이있다
안톤 Duzenko

전체 화면에서 세로 및 가로 클래스가 모두 일반인 iPad에서 작동합니까?
Deepak Sharma

귀하의 코드는 Apple의 코드와 동일하지 않으며 수직 크기 클래스 만 테스트합니다.
ADG

오랜만에 링크의 내용이 변경된 것 같습니다.
NYC 기술 엔지니어

3

[[UIApplication sharedApplication] statusBarOrientation]iOS9에서는 더 이상 사용되지 않으며 다양한 장치의 UITraitCollection 에 대해 테스트해야 합니다.

  override func willTransitionToTraitCollection(newCollection: UITraitCollection, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {

    if newCollection.containsTraitsInCollection(UITraitCollection(verticalSizeClass: .Regular)) {
      ...
    }
  }

6
세터 만 더 이상 사용되지 않습니다. Apple 직원이 "상태 표시 줄 방향을 읽는 것은 더 이상 사용되지 않으며, 기록 만하는 것입니다. 게터에서 헤더를 볼 때 헤더를 구성하는 방법에 오류가있을 수 있습니다." ( forums.developer.apple.com/thread/12937 )
Graham Perks

getter도 더 이상 사용되지 않습니다. 에 따르면 문서 가 있습니다.
Groot

0

Ipad에는 특성 수집 변경이 없으므로 시작 및 완료에서 회전을 감지하는 방법은 다음과 같습니다. Swift 5 구문은 다음과 같습니다.

override func viewWillTransition(to size: CGSize, with coordinator: 
UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)

    coordinator.animate(alongsideTransition: { [unowned self] _ in

        self.view.backgroundColor = UIColor.blue
        print("rotation in progress")

    }) { [unowned self] _ in
        self.view.backgroundColor = UIColor.green
        print("rotation complete")


    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.