Застарілі методи обертання, еквівалентні "didRotateFromInterfaceOrientation"?


137

Я намагаюся реалізувати новий viewWillTransitionToSizeметод, який був введений в iOS 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 ?. Чи можете ви мені поділитися методом, який ви використовували. Дякую
запитайте123

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
Дякую - я додам швидку версію як відповідь, щоб заощадити людей на деякий час
DogCoffee

3
в iOS 9. застаріле орієнтування заборонено, що ще є варіантом?
Діпак Шарма

1
@DeepakSharma Я трохи запізнююся на вечірку, але ви можете скористатися [UIDevice currentDevice].orientation. Ви також можете передати це в UIDeviceOrientationIsPortrait([UIDevice currentDevice].orientation)або UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation). Сподіваюся, це допомагає!
Джефф

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..не дзвонити. Це щось пов’язане з Simulator?
Saty

@Saty працює і в тренажері - просто перевіряється ще раз. Працює як очікувалося.
DogCoffee

1
в iOS 9. застаріле орієнтування заборонено, що ще є варіантом?
Діпак Шарма

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

Для чого потрібна анімація? Ви не можете відразу перевірити "newCollection"?
ціанід

@cyanide для синхронізації анімації з моїм
Майком

7

Прийнята відповідь у 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)
}

Це прекрасно працює для мене 👍


Не працює для мене на iOS 10 - він друкує стару орієнтацію, а не нову.
Ваддаді Картік

1
@VaddadiKartick, тому що ти повинен використовуватисьlet orient = newCollection.verticalSizeClass switch orient { case .compact: print("Lanscape") // Do something default: print("Portrait") // Do something else }
Майк Глухов

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 в тренажері, але мої заяви про друк не запускаються, якщо я тестую за допомогою iPad, так як traitsCollection не зміниться.

Це дивно, адже саме це рекомендує Apple :

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

У другому фрагменті коду відсутня дужка
Антон Дузенко

Чи працює це на iPad, коли вертикальні та горизонтальні класи регулярні на повноекранному?
Діпак Шарма

Ваш код не такий, як у Apple, ви протестуєте лише вертикальний клас розміру.
АДГ

Минув час, схоже, зміст посилання змінився.
Технічний інженер 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 )
Грем

Хіба ж геттер теж застарілий. Згідно з документацією, це так.
Грут

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


    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.