दिलचस्प पोस्ट
'उपयोगकर्ता परिभाषित प्रकार निर्धारित नहीं' त्रुटि कैसे matplotlib में एक साजिश को अद्यतन करने के लिए? सार्वजनिक फ़ील्ड बनाम स्वचालित गुण प्रत्येक WCF कॉल में कस्टम HTTP हैडर को कैसे जोड़ें? मिनटों में दो Joda-Time DateTimes के बीच अंतर कैसे प्राप्त करें क्या आप HTML5 विशेषताओं का उद्धरण करते हैं? काम कर रहे regex के साथ PHP preg_match मैं किस प्रकार एक MySQL डाटाबेस / टेबल / कॉलम सेट कर सकता हूं? स्लॉग बनाने के लिए PHP फ़ंक्शन (यूआरएल स्ट्रिंग) अग्रभूमि लेबल के साथ जेबटन में छवि जोड़ना एसोसिएशन टेबल में अतिरिक्त फ़ील्ड के साथ पहले, बहुत से कई कोड बनाएं ini फ़ाइल बनाएँ, PHP में मान लिखें मैं फाइल स्थान प्रोग्राम को कैसे बदल सकता हूं? क्लास में मेरे पास एक गैर-अभिन्न स्थिर कॉन्स्ट सदस्य क्यों नहीं हो सकता? जावास्क्रिप्ट में सबसे तेज़ एमडी 5 का कार्यान्वयन

अभिविन्यास परिवर्तन कैसे पता लगा सकता है?

मैं स्विफ्ट का उपयोग कर रहा हूं और जब मैं परिदृश्य में घुमाएगा तो मैं एक UIViewController को लोड करने में सक्षम होना चाहता हूं, क्या कोई मुझे सही दिशा में बता सकता है?

मुझे ऑनलाइन कुछ भी नहीं मिल रहा है और थोड़ा सा दस्तावेज द्वारा उलझन में है।

वेब के समाधान से एकत्रित समाधान "अभिविन्यास परिवर्तन कैसे पता लगा सकता है?"

यहां बताया गया है कि मैं इसे कैसे काम कर रहा हूं:

didFinishLaunchingWithOptions फ़ंक्शन के अंदर AppDelegate.swift मैंने रखा:

 NotificationCenter.default.addObserver(self, selector: #selector(AppDelegate.rotated), name: NSNotification.Name.UIDeviceOrientationDidChange, object: nil) 

और फिर AppDelegate वर्ग के अंदर मैं निम्नलिखित फ़ंक्शन डाल दिया:

 func rotated() { if UIDeviceOrientationIsLandscape(UIDevice.current.orientation) { print("Landscape") } if UIDeviceOrientationIsPortrait(UIDevice.current.orientation) { print("Portrait") } } 

उम्मीद है कि यह किसी और को मदद करता है!

धन्यवाद!

 override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { if UIDevice.current.orientation.isLandscape { print("Landscape") } else { print("Portrait") } } 

-orientation प्रॉपर्टी का प्रयोग सही नहीं है (भले ही यह अधिकांश मामलों में काम कर सकता है) और कुछ बगों को ले जा सकता है, उदाहरण के लिए UIDeviceOrientation ओरिएंटेशन डिवाइस के उन्मुखीकरण पर भी विचार करता है अगर यह चेहरा या नीचे है, तो कोई सीधा जोड़ी नहीं है उन मानों के लिए UIInterfaceOrientation enum में
इसके अलावा, यदि आप अपने ऐप को कुछ विशेष अभिविन्यास में लॉक करते हैं, तो यूआईडीवाइस आपको उस खाते को ध्यान में रखते हुए उपकरण उन्मुखीकरण देगा।
दूसरी तरफ iOS8 ने UIViewController वर्ग पर interfaceOrientation UIViewController प्रॉपर्टी को बहिष्कृत कर दिया है I
इंटरफ़ेस अभिविन्यास का पता लगाने के लिए 2 विकल्प उपलब्ध हैं:

  • स्थिति पट्टी अभिविन्यास का उपयोग करें
  • आईफोन पर आकार वर्गों का उपयोग करें, यदि वे ओवरराइड नहीं हैं तो वे आपको वर्तमान इंटरफ़ेस अभिविन्यास को समझने का एक तरीका दे सकते हैं

क्या अभी भी गायब है इंटरफ़ेस अभिविन्यास के परिवर्तन की दिशा को समझने का एक तरीका है, जो एनिमेशन के दौरान बहुत महत्वपूर्ण है।
WWDC 2014 के सत्र में "आईओएस 8 में नियंत्रक की प्रगति देखें" स्पीकर उस समस्या का समाधान भी प्रदान करता है, जो कि विधि का उपयोग करता है – क्या -will/DidRotateToInterfaceOrientation बदलता है

यहां प्रस्तावित समाधान आंशिक रूप से लागू किया गया है, यहां अधिक जानकारी:

 func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { let orientation = orientationFromTransform(coordinator.targetTransform()) let oldOrientation = UIApplication.sharedApplication().statusBarOrientation myWillRotateToInterfaceOrientation(orientation,duration: duration) coordinator.animateAlongsideTransition({ (ctx) in self.myWillAnimateRotationToInterfaceOrientation(orientation, duration:duration) }) { (ctx) in self.myDidAnimateFromInterfaceOrientation(oldOrientation) } } 

didRotate साथ कैमरे का उपयोग करते समय रोटेशन का पता लगाने की आवश्यकता है, और यह पाया कि मेरी जरूरतों के लिए didRotate ( अब पदावनत ) और willTransition विधि अविश्वसनीय थीं। डेविड द्वारा पोस्ट की गई अधिसूचना का उपयोग किया गया था, लेकिन स्विफ्ट 3.x / 4.x के लिए वर्तमान नहीं है।

स्विफ्ट 4.0 स्विफ़्ट 4.0 के साथ, ऐप्पल ने हमें #selector का उपयोग करने से बचने के लिए प्रोत्साहित किया है, इसलिए यह दृष्टिकोण अब एक पूरा ब्लॉक का उपयोग करता है यह दृष्टिकोण स्विफ्ट 3.x के साथ पीछे की तरफ से संगत है और आगे बढ़ने वाला अनुशंसित दृष्टिकोण होगा।

यह संकलक चेतावनी है जिसे आप स्विफ्ट 4.x प्रोजेक्ट में प्राप्त करेंगे यदि आप #selector फ़ंक्शन का उपयोग करते हैं:

यहां छवि विवरण दर्ज करें

कॉलबैक सेटअप करें:

 // If you do not use the notification var in your callback, // you can safely replace it with _ var didRotate: (Notification) -> Void = { notification in switch UIDevice.current.orientation { case .landscapeLeft, .landscapeRight: print("landscape") case .portrait, .portraitUpsideDown: print("Portrait") default: print("other") } } 

अधिसूचना सेटअप करें:

 NotificationCenter.default.addObserver(forName: .UIDeviceOrientationDidChange, object: nil, queue: .main, using: didRotate) 

इसके चीथड़े कर दो:

 NotificationCenter.default.removeObserver(self, name: .UIDeviceOrientationDidChange, object: nil) 

स्विफ्ट 3.0 यह मेरा पहला समाधान था, लेकिन मैं ऊपर 4.0 समाधान का उपयोग करने की सलाह देता हूं:

अधिसूचना सेटअप करें:

 NotificationCenter.default.addObserver(self, selector: #selector(rotated), name: NSNotification.Name.UIDeviceOrientationDidChange, object: nil) 

सूचना का जवाब दें:

 func rotated() { switch UIDevice.current.orientation { case .landscapeLeft, .landscapeRight: print("landscape") default: print("Portrait") } } 

अधिसूचना को मिटा दें:

 NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIDeviceOrientationDidChange, object: nil) 

आसान, यह iOS8 और 9 / स्विफ्ट 2 / Xcode7 में काम करता है, बस अपने viewcontroller.swift के अंदर इस कोड डाल दिया। यह हर ओरिएंटेशन परिवर्तन के साथ स्क्रीन आयाम प्रिंट करेगा, आप इसके बदले अपना कोड डाल सकते हैं:

 override func didRotateFromInterfaceOrientation(fromInterfaceOrientation: UIInterfaceOrientation) { getScreenSize() } var screenWidth:CGFloat=0 var screenHeight:CGFloat=0 func getScreenSize(){ screenWidth=UIScreen.mainScreen().bounds.width screenHeight=UIScreen.mainScreen().bounds.height print("SCREEN RESOLUTION: "+screenWidth.description+" x "+screenHeight.description) } 

नए दृश्य का उपयोग करेंउद्मतसंरचनाटॉसिज़ (_: ट्रान्सिशन कॉओर्डिनेटर के साथ 🙂

मुझे पता है कि यह प्रश्न Swift , लेकिन चूंकि यह Google खोज के लिए शीर्ष लिंक में से एक है और यदि आप Objective-C में एक ही कोड की तलाश कर रहे हैं:

 // add the observer [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(rotated:) name:UIDeviceOrientationDidChangeNotification object:nil]; // remove the observer [[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil]; // method signature - (void)rotated:(NSNotification *)notification { // do stuff here } 

उद्देश्य सी में

 -(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator 

तेज में

 func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) 

ओरिएंटेशन परिवर्तन का पता लगाने के लिए इस विधि को ओवरराइड करें।

स्विफ्ट 3.0 में ओरिएंटेशन परिवर्तन का पता लगाने के तरीके के पूर्ण कार्यान्वयन।

मैंने इस कार्यान्वयन का उपयोग करना चुना क्योंकि फोन की ओर face up और मेरे face down मेरे लिए महत्वपूर्ण था, और मैं चाहता हूं कि यह देखने के लिए केवल एक ही बार बदलने के लिए कि उन्मुखीकरण निर्दिष्ट स्थिति में था।

 import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() //1 NotificationCenter.default.addObserver(self, selector: #selector(deviceOrientationDidChange), name: NSNotification.Name.UIDeviceOrientationDidChange, object: nil) } deinit { //3 NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIDeviceOrientationDidChange, object: nil) } func deviceOrientationDidChange() { //2 switch UIDevice.current.orientation { case .faceDown: print("Face down") case .faceUp: print("Face up") case .unknown: print("Unknown") case .landscapeLeft: print("Landscape left") case .landscapeRight: print("Landscape right") case .portrait: print("Portrait") case .portraitUpsideDown: print("Portrait upside down") } } } 

नोट करने के लिए महत्वपूर्ण टुकड़े हैं:

  1. आप DeviceOrientationDidChange सूचना स्ट्रीम को सुनते हैं और इसे फ़ंक्शन डिवाइस में बाँधते हैंऑरिएंटेशनडिड चेंज
  2. आप तब डिवाइस ओरिएंटेशन पर स्विच करते हैं, ध्यान रखें कि समय पर एक unknown अभिविन्यास है।
  3. किसी भी अधिसूचना की तरह, दृश्य से पहले नियंत्रक को रद्द कर दिया जाता है, नोटिफिकेशन स्ट्रीम को देखना बंद करना सुनिश्चित करें।

उम्मीद है कि किसी को यह उपयोगी मिल जाएगा

 override func didRotate(from fromInterfaceOrientation: UIInterfaceOrientation) { //swift 3 getScreenSize() } func getScreenSize(){ let screenWidth = UIScreen.main.bounds.width let screenHeight = UIScreen.main.bounds.height print("SCREEN RESOLUTION: \(screenWidth.description) x \(screenHeight.description)") } 

स्विफ्ट 3 | यूआईडीवाइस ऑरिएंटेशन डिड चेंज अधिसूचना बहुत बार मनाया गया

जब आपका डिवाइस 3 डी स्पेस में अभिविन्यास बदलता है, तो निम्नलिखित कोड "deviceDidRotate" प्रिंट करता है – भले ही पोर्ट्रेट से लैंडस्केप ओरिएंटेशन में कोई परिवर्तन नहीं हो। उदाहरण के लिए, यदि आप अपना फोन पोर्ट्रेट ओरिएंटेशन में रखते हैं और उसे आगे और पीछे झुकाते हैं तो – डिवाइसडिडोटेट () को बार-बार कहा जाता है

 override func viewDidLoad() { super.viewDidLoad() NotificationCenter.default.addObserver( self, selector: #selector(deviceDidRotate), name: .UIDeviceOrientationDidChange, object: nil ) } func deviceDidRotate() { print("deviceDidRotate") } 

इसके आस-पास काम करने के लिए आप पिछले डिवाइस ओरिएंटेशन को पकड़ कर रख सकते हैं और डिवाइस में बदलाव के लिए जांच कर सकते हैंडीड्रोटेट ()।

 var previousDeviceOrientation: UIDeviceOrientation = UIDevice.current.orientation override func viewDidLoad() { super.viewDidLoad() NotificationCenter.default.addObserver( self, selector: #selector(deviceDidRotate), name: .UIDeviceOrientationDidChange, object: nil ) } func deviceDidRotate() { if UIDevice.current.orientation == previousDeviceOrientation { return } previousDeviceOrientation = UIDevice.current.orientation print("deviceDidRotate") } 

या आप एक अलग सूचना का उपयोग कर सकते हैं जो डिवाइस को लैंडस्केप से पोर्ट्रेट में बदलते समय ही कॉल किया जाता है। इस मामले में आप UIApplicationDidChangeStatusBarOrientation सूचना का उपयोग करना चाहते हैं

 override func viewDidLoad() { super.viewDidLoad() NotificationCenter.default.addObserver( self, selector: #selector(deviceDidRotate), name: .UIApplicationDidChangeStatusBarOrientation, object: nil ) } func deviceDidRotate() { print("deviceDidRotate") } 

मुझे अभिविन्यास की जांच करना पसंद है क्योंकि आप किसी भी वर्ग में इस सुविधा को जोड़ सकते हैं, कोई दृश्य या दृश्य नियंत्रक की आवश्यकता नहीं है। यहां तक ​​कि आपके ऐप प्रतिनिधि में भी

  //ask the system to start notifying when interface change UIDevice.currentDevice().beginGeneratingDeviceOrientationNotifications() //add the observer NSNotificationCenter.defaultCenter().addObserver( self, selector: #selector(self.orientationChanged(_:)), name: UIDeviceOrientationDidChangeNotification, object: nil) 

अधिसूचना कैश करने से

  func orientationChanged(notification : NSNotification) { //your code there } 

जांचें कि क्या रोटेशन के साथ बदल गया था: viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator)

coordinator.animateAlongsideTransition(nil) { (UIViewControllerTransitionCoordinatorContext) साथ। coordinator.animateAlongsideTransition(nil) { (UIViewControllerTransitionCoordinatorContext) आप जांच सकते हैं कि संक्रमण समाप्त हो गया है या नहीं।

नीचे दिए गए कोड देखें:

 override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator) coordinator.animateAlongsideTransition(nil) { (UIViewControllerTransitionCoordinatorContext) in // if you want to execute code after transition finished print("Transition finished") } if size.height < size.width { // Landscape print("Landscape") } else { // Portrait print("Portrait") } } 

डिवाइस अभिविन्यास का पता लगाने का एक आसान तरीका यहां है: ( स्विफ्ट 3 )

 override func willRotate(to toInterfaceOrientation: UIInterfaceOrientation, duration: TimeInterval) { handleViewRotaion(orientation: toInterfaceOrientation) } //MARK: - Rotation controls func handleViewRotaion(orientation:UIInterfaceOrientation) -> Void { switch orientation { case .portrait : print("portrait view") break case .portraitUpsideDown : print("portraitUpsideDown view") break case .landscapeLeft : print("landscapeLeft view") break case .landscapeRight : print("landscapeRight view") break case .unknown : break } } 

स्विफ्ट 3 के लिए

 override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { if UIDevice.current.orientation.isLandscape { //Landscape } else { //Portrait } } 

मेरा दृष्टिकोण समान है जो bpedit ऊपर दिखाता है, लेकिन एक आईओएस 9 + फोकस के साथ। जब दृश्य रोटेट करता है तो मैं FSCalendar के दायरे को बदलना चाहता था।

 override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator) coordinator.animateAlongsideTransition({ (context) in if size.height < size.width { self.calendar.setScope(.Week, animated: true) self.calendar.appearance.cellShape = .Rectangle } else { self.calendar.appearance.cellShape = .Circle self.calendar.setScope(.Month, animated: true) } }, completion: nil) } 

यह नीचे काम किया है, लेकिन मैं इसके बारे में झूठ महसूस किया 🙂

 coordinator.animateAlongsideTransition({ (context) in if size.height < size.width { self.calendar.scope = .Week self.calendar.appearance.cellShape = .Rectangle } }) { (context) in if size.height > size.width { self.calendar.scope = .Month self.calendar.appearance.cellShape = .Circle } } 

मैं UIUserInterfaceSizeClass का उपयोग एक UIViewController वर्ग में बदल गया अभिविन्यास का पता लगाने के लिए करता हूं:

 override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) { let isiPadLandscapePortrait = newCollection.horizontalSizeClass == .regular && newCollection.verticalSizeClass == .regular let isiPhonePlustLandscape = newCollection.horizontalSizeClass == .regular && newCollection.verticalSizeClass == .compact let isiPhonePortrait = newCollection.horizontalSizeClass == .compact && newCollection.verticalSizeClass == .regular let isiPhoneLandscape = newCollection.horizontalSizeClass == .compact && newCollection.verticalSizeClass == .compact if isiPhonePortrait { // do something... } } 
 - (void)viewDidLoad { [super viewDidLoad]; [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(OrientationDidChange:) name:UIDeviceOrientationDidChangeNotification object:nil]; } -(void)OrientationDidChange:(NSNotification*)notification { UIDeviceOrientation Orientation=[[UIDevice currentDevice]orientation]; if(Orientation==UIDeviceOrientationLandscapeLeft || Orientation==UIDeviceOrientationLandscapeRight) { NSLog(@"Landscape"); } else if(Orientation==UIDeviceOrientationPortrait) { NSLog(@"Potrait Mode"); } } 

नोट: UIViewController की पहचान करने के लिए इस कोड का उपयोग केवल उन्मुखीकरण में है

यदि आप रोटेशन पूर्ण होने के बाद कुछ करना चाहते हैं, तो आप इस तरह UIViewControllerTransitionCoordinator पूर्णता हैंडलर का उपयोग कर सकते हैं

 public override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { super.viewWillTransition(to: size, with: coordinator) // Hook in to the rotation animation completion handler coordinator.animate(alongsideTransition: nil) { (_) in // Updates to your UI... self.tableView.reloadData() } }