दिलचस्प पोस्ट
एक पायथन स्क्रिप्ट के भीतर से UAC उन्नयन का अनुरोध करें? एंड्रॉइड में एचटीएमएल टैग्स को पट्टी या पलायन कैसे करें क्या आप JSON ऑब्जेक्ट में एक पीछे वाले अल्पविराम का उपयोग कर सकते हैं? एंड्रॉइड में एक छवि कैसे डाउनलोड और सहेज सकती है सीएसएस: अस्पष्टता के साथ पृष्ठभूमि छवि सेट? एचटीएमएल को ई-मेल के लिए PHP में सादा पाठ में परिवर्तित करना Server.UrlEncode बनाम HttpUtility.UrlEncode एंड्रॉइड स्टूडियो त्रुटि: त्रुटि: CreateProcess त्रुटि = 216,% 1 का यह संस्करण आप चला रहे विंडोज के संस्करण के साथ संगत नहीं है एनवीडिया जीपीयू (सीयूडीए) के साथ जावा का उपयोग करना JQuery-Mobile / Phonegap को एक साथ उपयोग करने का सही तरीका है? स्थिर संपत्ति के लिए बाध्यकारी छवियों के साथ ओपनसीवी और एसवीएम का उपयोग करना स्थानीय फ़ाइलों को अधिलेखित करने के लिए मैं "git पुल" को कैसे बाध्य कर सकता हूं? आईफ़ोन: साझा करने के लिए रिकॉर्ड किए गए प्रोग्राम को प्रोग्रामेटिक रूप से संपीड़ित करना है? स्विफ्ट 3 में प्रेषण कतार कैसे बनाएं

स्क्रीन के उन्मुखीकरण-निर्भर ऊँचाई और चौड़ाई कैसे प्राप्त करें?

मैं अपने अनुप्रयोग की वर्तमान ऊँचाई और चौड़ाई को निर्धारित करने के लिए कार्यक्रम की कोशिश कर रहा हूं। मैं इसका उपयोग करता हूं:

CGRect screenRect = [[UIScreen mainScreen] bounds]; 

लेकिन ये 320 की चौड़ाई और 480 की ऊंचाई पैदा करता है, चाहे डिवाइस चित्र या लैंडस्केप अभिविन्यास में है या नहीं। मैं अपनी मुख्य स्क्रीन की वर्तमान चौड़ाई और ऊंचाई (यानी डिवाइस अभिविन्यास पर निर्भर) कैसे तय कर सकता हूं?

वेब के समाधान से एकत्रित समाधान "स्क्रीन के उन्मुखीकरण-निर्भर ऊँचाई और चौड़ाई कैसे प्राप्त करें?"

आप उन्मुखीकरण का निर्धारण करने के लिए और तदनुसार आयामों का उपयोग करने के लिए UIInterfaceOrientationIsPortrait([UIApplication sharedApplication].statusBarOrientation) तरह कुछ का उपयोग कर सकते हैं।

हालांकि, एक अभिविन्यास परिवर्तन के दौरान जैसे UIViewController के

 - (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 

UIApplication की स्थिति toInterfaceOrientation बाद से toInterfaceOrientation में पारित अभिविन्यास का प्रयोग अभी भी पुराने अभिविन्यास को इंगित करेगा क्योंकि यह अभी तक परिवर्तित नहीं हुआ है (क्योंकि आप एक ईवेंट ईवेंट हैंडल के अंदर हैं)।

सारांश

इसमें कई संबंधित पोस्ट हैं, लेकिन उनमें से प्रत्येक को यह संकेत मिलता है कि आपको यह करना है:

  1. आयाम प्राप्त करने के लिए [[UIScreen mainScreen] bounds]
  2. जांचें कि आप किस दिशा में हैं, और
  3. स्थिति पट्टी ऊंचाई के लिए खाता (यदि दिखाया गया है)

लिंक

  • आईफ़ोन: वर्तमान दृश्य आयाम या स्क्रीन आयाम प्राप्त करें
  • आईफोन / आईपैड: प्रोग्रामिंग की स्क्रीन चौड़ाई कैसे प्राप्त करें?
  • उद्देश्य सी – कैसे वर्तमान स्क्रीन संकल्प प्राप्त करने के लिए?
  • IPhone या iPad में पुन: अभिविन्यास के बाद "गलत" फ्रेम / विंडो आकार
  • आईफोन देव एसडीके – स्क्रीन की चौड़ाई प्राप्त करें

कार्य कोड

मैं आमतौर पर इसे दूर नहीं जाना है, लेकिन आप मेरी दिलचस्पी खारिज कर दिया निम्नलिखित कोड को चाल करना चाहिए। मैंने UIApplication पर एक श्रेणी लिखा था मैं मौजूदा सिज़न या किसी दिए गए अभिविन्यास में आकार प्राप्त करने के लिए क्लास विधियों को जोड़ दिया, जो कि आप UIViewController के willRotateToInterfaceOrientation:duration: में कॉल करेंगे willRotateToInterfaceOrientation:duration: :।

 @interface UIApplication (AppDimensions) +(CGSize) currentSize; +(CGSize) sizeInOrientation:(UIInterfaceOrientation)orientation; @end @implementation UIApplication (AppDimensions) +(CGSize) currentSize { return [UIApplication sizeInOrientation:[UIApplication sharedApplication].statusBarOrientation]; } +(CGSize) sizeInOrientation:(UIInterfaceOrientation)orientation { CGSize size = [UIScreen mainScreen].bounds.size; UIApplication *application = [UIApplication sharedApplication]; if (UIInterfaceOrientationIsLandscape(orientation)) { size = CGSizeMake(size.height, size.width); } if (application.statusBarHidden == NO) { size.height -= MIN(application.statusBarFrame.size.width, application.statusBarFrame.size.height); } return size; } @end 

कोड को सरल कॉल [UIApplication currentSize] उपयोग करने के लिए इसके अलावा, मैं उपरोक्त कोड चलाता हूं, इसलिए मुझे पता है कि यह काम करता है और सभी झुकावों में सही प्रतिक्रियाओं की रिपोर्ट करता है। ध्यान दें कि मैं स्टेटस बार में कारक हूं। दिलचस्प बात यह है कि मुझे स्थिति बार की ऊँचाई और चौड़ाई के न्यूनतम घटा देना पड़ा।

उम्मीद है की यह मदद करेगा। : डी

अन्य विचार

आप rootViewController के rootViewController प्रॉपर्टी को rootViewController हुए आयामों को प्राप्त करने के बारे में जा सकते हैं। मैंने इसे अतीत में देखा है और यह समान रूप से पोर्ट्रेट और परिदृश्य दोनों में एक ही आयाम की रिपोर्ट करता है, इसके अलावा यह रिपोर्ट करता है कि एक रोटेट ट्रांस्फ़ॉर्म हो रहा है:

(जीडीबी) पो [[[UIApplication साझा किया गया अनुप्रयोग] कुंजी [वाइंडो] रूटव्यूकंट्रोलर] दृश्य]

<UILayoutContainerView: 0xf7296f0; फ्रेम = (0 0; 320 480); परिणत = [0, -1, 1, 0, 0, 0]; ऑटोरेसिज = डब्ल्यू एच; एच; परत = <CALayer: 0xf729b80 >>

(जीडीबी) पो [[[UIApplication साझा किया गया अनुप्रयोग] कुंजी [वाइंडो] रूटव्यूकंट्रोलर] दृश्य]

<UILayoutContainerView: 0xf7296f0; फ्रेम = (0 0; 320 480); ऑटोरेसिज = डब्ल्यू एच; एच; परत = <CALayer: 0xf729b80 >>

सुनिश्चित नहीं हैं कि आपका ऐप कैसे काम करता है, लेकिन अगर आप किसी प्रकार के नेविगेशन नियंत्रक का उपयोग नहीं कर रहे हैं, तो आप अपने मुख्य दृश्य के तहत एक UIView अधिकतम ऊंचाई / अभिभावक की चौड़ाई के साथ और माता पिता के साथ बढ़ता / गिरता हो सकता है। फिर आप ऐसा कर सकते हैं: [[[[[[[UIApplication sharedApplication] keyWindow] rootViewController] view] subviews] objectAtIndex:0] frame] । यह एक पंक्ति पर बहुत तीव्र दिखती है, लेकिन आपको यह विचार मिलता है

हालांकि … यह अभी भी सारांश के तहत उपरोक्त 3 चरणों को करना बेहतर होगा। UIWindows के साथ गड़बड़ करना शुरू करें और आपको अजीब सामान मिल जाएंगे, जैसे यूआईएलएलिटिव्यू दिखाना यूआईएपीसीकरण की कुंजीविंडो को एक नई यूआई विन्डो पर इंगित करने के लिए बदल देगा जो कि यूआईएएलर्टव्यू बनाया गया था। किसे पता था? मैं कुंजी पर निर्भर बग पाने के बाद किया Window और पता चला कि यह इस तरह बदल गया!

यह मेरा समाधान कोड है! यह विधि NSObject वर्ग के Categroy में जोड़ सकते हैं, या आप शीर्ष कस्टम UIViewController वर्ग को परिभाषित कर सकते हैं, और अपने सभी अन्य UIViewControllers इसे प्राप्त करने के लिए दे सकते हैं।

 -(CGRect)currentScreenBoundsDependOnOrientation { CGRect screenBounds = [UIScreen mainScreen].bounds ; CGFloat width = CGRectGetWidth(screenBounds) ; CGFloat height = CGRectGetHeight(screenBounds) ; UIInterfaceOrientation interfaceOrientation = [UIApplication sharedApplication].statusBarOrientation; if(UIInterfaceOrientationIsPortrait(interfaceOrientation)){ screenBounds.size = CGSizeMake(width, height); }else if(UIInterfaceOrientationIsLandscape(interfaceOrientation)){ screenBounds.size = CGSizeMake(height, width); } return screenBounds ; } 

नोट , आईओएस 88 के बाद, यूएसस्क्रीन की सीमा संपत्ति के एप्पल दस्तावेज़ के रूप में कहते हैं:

विचार-विमर्श

यह आयत वर्तमान समन्वय क्षेत्र में निर्दिष्ट है, जो डिवाइस के लिए किसी भी इंटरफ़ेस रोटेशन को ध्यान में रखता है। इसलिए, जब पोर्ट्रेट और लैंडस्केप ओरिएंटेशन के बीच डिवाइस घूमता है तो इस गुण का मूल्य बदल सकता है।

इसलिए संगतता के विचार के लिए, हमें आईओएस संस्करण का पता लगाना चाहिए और नीचे परिवर्तन करना चाहिए:

 #define IsIOS8 (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1) -(CGRect)currentScreenBoundsDependOnOrientation { CGRect screenBounds = [UIScreen mainScreen].bounds ; if(IsIOS8){ return screenBounds ; } CGFloat width = CGRectGetWidth(screenBounds) ; CGFloat height = CGRectGetHeight(screenBounds) ; UIInterfaceOrientation interfaceOrientation = [UIApplication sharedApplication].statusBarOrientation; if(UIInterfaceOrientationIsPortrait(interfaceOrientation)){ screenBounds.size = CGSizeMake(width, height); }else if(UIInterfaceOrientationIsLandscape(interfaceOrientation)){ screenBounds.size = CGSizeMake(height, width); } return screenBounds ; } 

यहाँ एक आसान मैक्रो है:

 #define SCREEN_WIDTH (UIInterfaceOrientationIsPortrait([UIApplication sharedApplication].statusBarOrientation) ? [[UIScreen mainScreen] bounds].size.width : [[UIScreen mainScreen] bounds].size.height) #define SCREEN_HEIGHT (UIInterfaceOrientationIsPortrait([UIApplication sharedApplication].statusBarOrientation) ? [[UIScreen mainScreen] bounds].size.height : [[UIScreen mainScreen] bounds].size.width) 

आईओएस 8+ में आपको viewWillTransitionToSize:withTransitionCoordinator उपयोग करना चाहिए viewWillTransitionToSize:withTransitionCoordinator विधि के साथ:

 -(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator { [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; // You can store size in an instance variable for later currentSize = size; // This is basically an animation block [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) { // Get the new orientation if you want UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; // Adjust your views [self.myView setFrame:CGRectMake(0, 0, size.width, size.height)]; } completion:^(id<UIViewControllerTransitionCoordinatorContext> context) { // Anything else you need to do at the end }]; } 

यह नापसंद एनीमेशन विधि की जगह है, जो आकार के बारे में कोई जानकारी नहीं देता:

 -(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)orientation duration:(NSTimeInterval)duration 

आईओएस के रूप में 8 स्क्रीन सीमा अब वर्तमान ओरिएंटेशन के लिए सही लौटा दी गई है। इसका अर्थ लैंडस्केप अभिविन्यास में एक आईपैड (UIScreen मुख्य स्क्रीन) है। बॉल IOS पर 768 = 7 और आईओएस 8 पर 1024 पर लौटाएगा।

निम्न रिलीज किए गए सभी संस्करणों पर सही ऊँचाई और चौड़ाई लौटाता है

 -(CGRect)currentScreenBoundsDependOnOrientation { NSString *reqSysVer = @"8.0"; NSString *currSysVer = [[UIDevice currentDevice] systemVersion]; if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending) return [UIScreen mainScreen].bounds; CGRect screenBounds = [UIScreen mainScreen].bounds ; CGFloat width = CGRectGetWidth(screenBounds) ; CGFloat height = CGRectGetHeight(screenBounds) ; UIInterfaceOrientation interfaceOrientation = [UIApplication sharedApplication].statusBarOrientation; if(UIInterfaceOrientationIsPortrait(interfaceOrientation)){ screenBounds.size = CGSizeMake(width, height); NSLog(@"Portrait Height: %f", screenBounds.size.height); }else if(UIInterfaceOrientationIsLandscape(interfaceOrientation)){ screenBounds.size = CGSizeMake(height, width); NSLog(@"Landscape Height: %f", screenBounds.size.height); } return screenBounds ; } 

यदि आप अभिविन्यास निर्भर आकार चाहते हैं और आपके पास एक दृश्य है, तो आप इसका उपयोग कर सकते हैं:

 view.bounds.size 

मैंने UIScreen लिए श्रेणी लिखा, जो सभी आईओएस संस्करणों पर काम करता है, ताकि आप इसे इस तरह से उपयोग कर सकें:
[[UIScreen mainScreen] currentScreenSize]

 @implementation UIScreen (ScreenSize) - (CGSize)currentScreenSize { CGRect screenBounds = [[UIScreen mainScreen] bounds]; CGSize screenSize = screenBounds.size; if ( NSFoundationVersionNumber <= NSFoundationVersionNumber_iOS_7_1 ) { UIInterfaceOrientation interfaceOrientation = [[UIApplication sharedApplication] statusBarOrientation]; if ( UIInterfaceOrientationIsLandscape(interfaceOrientation) ) { screenSize = CGSizeMake(screenSize.height, screenSize.width); } } return screenSize; } @end 

अभिविन्यास पर निर्भर स्क्रीन आकार प्राप्त करने का एक तेज़ तरीका है:

 var screenWidth: CGFloat { if UIInterfaceOrientationIsPortrait(screenOrientation) { return UIScreen.mainScreen().bounds.size.width } else { return UIScreen.mainScreen().bounds.size.height } } var screenHeight: CGFloat { if UIInterfaceOrientationIsPortrait(screenOrientation) { return UIScreen.mainScreen().bounds.size.height } else { return UIScreen.mainScreen().bounds.size.width } } var screenOrientation: UIInterfaceOrientation { return UIApplication.sharedApplication().statusBarOrientation } 

ये मेरा एक प्रोजेक्ट में मानक फ़ंक्शन के रूप में शामिल किया गया है:

https://github.com/goktugyil/EZSwiftExtensions

 float msWidth = [[UIScreen mainScreen] bounds].size.width*(IS_RETINA?2.0f:1.0f); float msHeight = [[UIScreen mainScreen] bounds].size.height*(IS_RETINA?2.0f:1.0f); if ( UIInterfaceOrientationIsPortrait(self.interfaceOrientation) ) { os->setWidth(MIN(msWidth, msHeight)); os->setHeight(MAX(msWidth, msHeight)); } else { os->setWidth(MAX(msWidth, msHeight)); os->setHeight(MIN(msWidth, msHeight)); } NSLog(@"screen_w %f", os->getWidth()); NSLog(@"screen_h %f", os->getHeight()); 

हालांकि, आईओएस 8.0.2 पर:

 + (NSUInteger)currentWindowWidth { NSInteger width = 0; UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; CGSize size = [UIScreen mainScreen].bounds.size; // if (UIInterfaceOrientationIsLandscape(orientation)) { // width = size.height; // } else { width = size.width; // } return width; }