रोटेशन विधियों को हटा दिया गया, 'didRotateFromInterfaceOrientation' के बराबर?


137

मैं नए viewWillTransitionToSizeतरीके को लागू करने की कोशिश कर रहा हूं जिसे आईओएस 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 में स्टेटसबोरिएरिएशन को हटा दिया गया है और विकल्प क्या है?
दीपक शर्मा

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मेरे लॉग के लिए कुछ भी नहीं था । मुझे लगता है क्योंकि इस विधि को नहीं बुलाया जा रहा है। क्या आप किसी और चीज के बारे में सोच सकते हैं जिसे काम करने के लिए प्लग इन करना होगा?
ट्रिप

मैंने इसे केवल एक खाली प्रोजेक्ट (यूनिवर्सल ऐप) में जोड़ा और यह कुछ भी जोड़ने की आवश्यकता के बिना ठीक काम करता है। हो सकता है कि विधि की शुरुआत में एक लॉग स्टेटमेंट डालें और देखें कि क्या कहा जा रहा है। मैं ऐसा कुछ भी नहीं सोच सकता जिसे आपको जोड़ना होगा। आईओएस आप क्या चला रहे हैं?
बजे डॉग कॉफ़ी

@ डॉगकॉफी..कहा नहीं जा रहा है। यह सिम्युलेटर के साथ कुछ भी करना है?
शनि

@ सट्टी सिम्युलेटर में भी काम करता है - बस फिर से जाँच की जाती है। उम्मीद के मुताबिक काम करता है।
डॉग कॉफ़ी

1
iOS 9 में स्टेटसबोरिएरिएशन को हटा दिया गया है और विकल्प क्या है?
दीपक शर्मा

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
माइक ग्लूखोव

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 पर मेरे लिए काम नहीं करता है - यह पुराने अभिविन्यास को प्रिंट करता है, नए को नहीं।
वदादी कार्तिक

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 का उपयोग कर परीक्षण करता हूं क्योंकि traitsCollect नहीं बदलेगा।

यह अजीब है क्योंकि यह वही है जो 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 जैसा नहीं है, आप केवल ऊर्ध्वाधर आकार वर्ग का परीक्षण कर रहे हैं।
ADG

कुछ समय हो गया है, ऐसा लगता है कि लिंक की सामग्री बदल गई है।
एनवाईसी टेक इंजीनियर

3

[[UIApplication sharedApplication] statusBarOrientation]iOS9 में पदावनत किया गया है आपको विभिन्न उपकरणों के लिए UITraitCollection के खिलाफ परीक्षण करना होगा

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

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

6
केवल सेटर को पदावनत किया गया था। Apple के एक कर्मचारी ने पोस्ट किया, "स्टेटस बार ओरिएंटेशन को पढ़ना नहीं है, केवल इसे लिखना है। यह त्रुटि हो सकती है कि कैसे हम हेडर का निर्माण करें यदि आप इसे गेटर पर देख रहे हैं।" ( forum.developer.apple.com/thread/12937 )
ग्राहम पर्क्स

हालांकि गेट्टर भी नहीं निकाला गया है। प्रलेखन के अनुसार यह है।
Groot

0

Ipad पर कोई विशेषता संग्रह परिवर्तन नहीं है, इसलिए यहां बताया गया है कि आप प्रारंभ और पूर्ण होने से रोटेशन का पता कैसे लगाते हैं। यहाँ स्विफ्ट 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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.