[ios] ‘didRotateFromInterfaceOrientation’과 같은 회전 방법이 더 이상 사용되지 않습니까?

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



답변

알았어 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];
}


답변

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

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)
}


답변

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)
    }


답변

스위프트 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)
}

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


답변

문제는 다음과 같습니다. 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
    }
}


답변

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

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

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


답변

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")


    }
}