Các phương thức xoay vòng không dùng nữa, tương đương với 'didRotateFromInterfaceOrientation'?


137

Tôi đang cố gắng thực hiện viewWillTransitionToSizephương pháp mới đã được giới thiệu trong iOS 8 (tất cả các phương pháp xoay vòng khác đã không được chấp nhận). Tôi muốn biết hiện tại tương đương với cái gì didRotateFromInterfaceOrientationvì có một số nhiệm vụ dọn dẹp chúng ta cần thực hiện và tôi không thể thấy một khối mà chúng ta có thể gán UIViewControllerTransitionCoordinatorđể được gọi khi 'chuyển đổi' sang mới kích thước kết thúc. Cảm ơn.

Câu trả lời:


255

Được rồi tìm thấy nó, chỉ cần sử dụng animateAlongsideTransition:completion:phương pháp trên thông qua 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];
}

Phương thức này sẽ gọi mỗi khi chúng ta xoay vòng như didRotateFromInterfaceOrientation?. Bạn có thể vui lòng chia sẻ cho tôi phương pháp bạn đã sử dụng. Cảm ơn bạn
hỏi123

2
Nó sẽ được thôi. Đây là những gì tôi làm: - (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]; }
lạ

1
Cảm ơn - tôi sẽ thêm một phiên bản nhanh chóng như một câu trả lời để tiết kiệm thời gian cho mọi người
DogCoffee 10/03/2015

3
statusbarorientation bị phản đối trong iOS 9. Tùy chọn nào khác?
Deepak Sharma

1
@DeepakSharma Tôi đến bữa tiệc muộn một chút, nhưng bạn có thể sử dụng [UIDevice currentDevice].orientation. Bạn cũng có thể dẫn nó vào UIDeviceOrientationIsPortrait([UIDevice currentDevice].orientation)hoặc UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation). Hi vọng điêu nay co ich!
Jeff

70

Phiên bản Swift của câu trả lời lạ

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

Thật lạ vì tôi đã đặt cái này vào ViewContoder của mình và nó không có printgì với nhật ký của tôi. Tôi đoán bởi vì phương pháp này không được gọi. Bạn có thể nghĩ bất cứ điều gì khác cần phải được cắm để làm việc này không?
Chuyến đi

Tôi vừa thêm nó vào một dự án trống (Ứng dụng phổ quát) và nó hoạt động tốt mà không cần thêm bất cứ thứ gì. Có thể đặt một câu lệnh log ngay từ đầu của phương thức và xem nó có được gọi không. Tôi không thể nghĩ bất cứ điều gì mà bạn sẽ cần phải thêm. Bạn đang chạy iOS gì?
DogCoffee

@ DogCoffee..its không được gọi. Nó có liên quan gì đến Simulator không?
Saty

@Saty cũng hoạt động trong trình giả lập - chỉ cần kiểm tra lại sau đó. Hoạt động như mong đợi.
DogCoffee

1
statusbarorientation bị phản đối trong iOS 9. Tùy chọn nào khác?
Deepak Sharma

10

iOS 10.3 & Swift 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)
    }

Tại sao bạn cần hoạt hình? Bạn không thể kiểm tra 'newCollection' ngay lập tức?
xyanua

@cyanide để đồng bộ hóa hoạt hình với tôi
Mike Glukhov

7

Câu trả lời được chấp nhận trong Swift 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)
}

Nó hoạt động tốt với tôi


Không hoạt động với tôi trên iOS 10 - nó in hướng cũ, không phải hướng mới.
Vaddadi Kartick

1
@VaddadiKartick vì bạn nên sử dụnglet orient = newCollection.verticalSizeClass switch orient { case .compact: print("Lanscape") // Do something default: print("Portrait") // Do something else }
Mike Glukhov

5

Vì câu hỏi là: cái gì tương đương với didRotateFromInterfaceOrientation

Tôi nghĩ rằng tôi đã đóng góp mã dưới đây:

@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

Tôi đã thử nghiệm trên iPhone trong trình giả lập, nhưng các báo cáo in của tôi sẽ không được chạy nếu tôi kiểm tra bằng iPad vì các đặc điểm của Bộ sưu tập sẽ không thay đổi.

Điều này thật lạ vì đây chính xác là những gì Apple khuyến nghị :

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

Có một dấu ngoặc bị thiếu trong đoạn mã thứ hai
Anton Duzenko

Điều này có hoạt động trên iPad khi cả hai lớp dọc và ngang đều đặn trên toàn màn hình không?
Deepak Sharma

Mã của bạn không giống như của Apple, bạn chỉ đang kiểm tra lớp kích thước dọc.
ADG

Đã được một lúc, có vẻ như nội dung của liên kết đã thay đổi.
Kỹ sư công nghệ NYC

3

[[UIApplication sharedApplication] statusBarOrientation]không dùng nữa trong iOS9, bạn phải kiểm tra UITraitCollection cho các thiết bị khác nhau.

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

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

6
Chỉ có setter bị phản đối. Một nhân viên của Apple đã đăng: "Đọc hướng thanh trạng thái không bị phản đối, chỉ viết cho nó. Đây có thể là một lỗi trong cách chúng tôi xây dựng tiêu đề nếu bạn thấy điều này trên getter." ( forum.developer.apple.com/thread/12937 )
Graham Perks

Không phải là getter cũng không được tán thành. Theo các tài liệu đó là.
Groot

0

Trên Ipad không có thay đổi bộ sưu tập đặc điểm, vì vậy đây là cách bạn phát hiện vòng quay từ khi bắt đầu và hoàn thành. Đây là cú pháp 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")


    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.