วิธีการหมุนเลิกใช้แล้วเทียบเท่ากับ '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];
}

เมธอดนี้จะเรียกทุกครั้งที่เราหมุนเหมือนการหมุนรอบทิศทาง คุณช่วยแบ่งปันวิธีการที่คุณใช้ ขอบคุณ
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
ขอบคุณ - ฉันจะเพิ่มเวอร์ชันที่รวดเร็วเป็นคำตอบเพื่อช่วยชีวิตผู้คนบางครั้ง
DogCoffee

3
Statusbarorientation เลิกใช้แล้วใน iOS 9 มีตัวเลือกอะไรอีกบ้าง?
Deepak Sharma

1
@DeepakSharma ฉันไปงานปาร์ตี้ช้า แต่คุณสามารถใช้งาน[UIDevice currentDevice].orientationได้ คุณยังสามารถท่อเป็นแบบนี้หรือUIDeviceOrientationIsPortrait([UIDevice currentDevice].orientation) UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation)หวังว่านี่จะช่วยได้!
เจฟ

70

The Swift Version ของคำตอบแปลก ๆ

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
Statusbarorientation เลิกใช้แล้วใน iOS 9 มีตัวเลือกอะไรอีกบ้าง?
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)
    }

ทำไมคุณถึงต้องการภาพเคลื่อนไหว คุณไม่สามารถตรวจสอบ 'newCollection' ได้ทันทีหรือไม่
ไซยาไนด์

@ ไซยาไนด์เพื่อซิงค์ภาพเคลื่อนไหวกับของฉัน
Mike Glukhov

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 - มันพิมพ์การวางแนวแบบเก่าไม่ใช่แบบใหม่
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 ในเครื่องจำลอง แต่คำสั่งการพิมพ์ของฉันจะไม่ทำงานหากฉันทดสอบการใช้ iPad เนื่องจากลักษณะการเก็บรวบรวมจะไม่เปลี่ยนแปลง

มันแปลกเพราะนี่คือสิ่งที่ Apple แนะนำ :

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

มีวงเล็บในตัวอย่างโค้ดที่สองหายไป
Anton Duzenko

สิ่งนี้ใช้ได้กับ iPad ที่มีคลาสทั้งแนวตั้งและแนวนอนเป็นแบบปกติบนเต็มหน้าจอหรือไม่
Deepak Sharma

รหัสของคุณไม่เหมือนกับแอปเปิ้ลคุณกำลังทดสอบขนาดแนวตั้งเท่านั้น
ADG

ไม่นานดูเหมือนว่าเนื้อหาของลิงก์จะเปลี่ยนไป
NYC Tech Engineer

3

[[UIApplication sharedApplication] statusBarOrientation]เลิกใช้แล้วใน iOS9 คุณต้องทดสอบกับUITraitCollectionสำหรับอุปกรณ์ต่าง ๆ

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

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

6
มีเพียงตัวตั้งค่าเท่านั้นที่เลิกใช้งาน พนักงานของ Apple ที่โพสต์ข้อความว่า "การอ่านการวางแนวแถบสถานะไม่ได้คัดค้านเฉพาะการเขียนลงไปเท่านั้นนี่อาจเป็นข้อผิดพลาดในวิธีที่เราสร้างส่วนหัวหากคุณเห็นสิ่งนี้บน getter" ( forums.developer.apple.com/thread/12937 )
Graham Perks

ไม่ทะเยอทะยานเช่นกัน ตามเอกสารมันเป็น
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.