IOS में स्क्रीन की चौड़ाई और ऊंचाई कैसे प्राप्त करें?


506

IOS में स्क्रीन के आयाम कैसे प्राप्त कर सकते हैं?

वर्तमान में, मैं उपयोग करता हूं:

lCurrentWidth = self.view.frame.size.width;
lCurrentHeight = self.view.frame.size.height;

में viewWillAppear:औरwillAnimateRotationToInterfaceOrientation:duration:

पहली बार मुझे पूरे स्क्रीन का आकार मिला। दूसरी बार जब मुझे स्क्रीन माइनस द नेव बार मिलता है।

जवाबों:


1063

IOS में स्क्रीन के आयाम कैसे प्राप्त कर सकते हैं?

आपके द्वारा पोस्ट किए गए कोड के साथ समस्या यह है कि आप स्क्रीन के उस से मेल खाने के लिए दृश्य आकार पर भरोसा कर रहे हैं, और जैसा कि आपने देखा है कि हमेशा ऐसा नहीं होता है। यदि आपको स्क्रीन आकार की आवश्यकता है, तो आपको उस वस्तु को देखना चाहिए जो स्क्रीन का प्रतिनिधित्व करती है, जैसे:

CGRect screenRect = [[UIScreen mainScreen] bounds];
CGFloat screenWidth = screenRect.size.width;
CGFloat screenHeight = screenRect.size.height;

विभाजन दृश्य के लिए अद्यतन: टिप्पणियों में, दिमित्री ने पूछा:

मैं विभाजित दृश्य में स्क्रीन का आकार कैसे प्राप्त कर सकता हूं?

ऊपर दिया गया कोड स्क्रीन के आकार की रिपोर्ट करता है, यहां तक ​​कि विभाजित स्क्रीन मोड में भी। जब आप स्प्लिट स्क्रीन मोड का उपयोग करते हैं, तो आपके ऐप की विंडो बदल जाती है। यदि ऊपर दिया गया कोड आपको वह जानकारी नहीं देता है जिसकी आप उम्मीद करते हैं, तो ओपी की तरह, आप गलत वस्तु को देख रहे हैं। इस मामले में, हालांकि, आपको स्क्रीन के बजाय विंडो को देखना चाहिए, जैसे:

CGRect windowRect = self.view.window.frame;
CGFloat windowWidth = windowRect.size.width;
CGFloat windowHeight = windowRect.size.height;

स्विफ्ट 4.2

let screenRect = UIScreen.main.bounds
let screenWidth = screenRect.size.width
let screenHeight = screenRect.size.height

// split screen            
let windowRect = self.view.window?.frame
let windowWidth = windowRect?.size.width
let windowHeight = windowRect?.size.height

7
ओरिएंटेशन वास्तव में व्यू कंट्रोलर स्तर पर प्रबंधित होता है। एक कंट्रोलर के इंटरफ़ेस ओरिएंटेशन को देखने का प्रबंध करें । तो हां, अपने व्यू कंट्रोलर के इंटरफेसऑरिजेंटेशन प्रॉपर्टी को देखें। BTW, आपने स्क्रीन के आकार के बारे में पूछा, तो यही मैंने आपको दिखाया, लेकिन अपनी सामग्री को प्रदर्शित करने के लिए आपको संभवतः खिड़की के सीमा या स्क्रीन के अनुप्रयोग का उपयोग करना चाहिए, जो आप कर रहे हैं उसके आधार पर।
कालेब

2
यह नोट करना उपयोगी है कि यह बिना पैडिंग के पूर्ण स्क्रीन की चौड़ाई लौटाता है । अधिकांश तत्वों के लिए 'प्रयोग करने योग्य' स्थान प्राप्त करने के लिए इन परिणामों से बस अपने ऐप की पेडिंग (प्रत्येक तरफ 20) को घटाएं
निक डॉगीरिटी

2
@NickDaugherty हाँ, यह बात है - ओपी स्क्रीन आयाम चाहता था। जहां आप स्क्रीन पर ऑब्जेक्ट डालते हैं, वह पूरी तरह से आपके ऊपर होता है और इस बात पर निर्भर करता है कि आप किस प्रकार का ऐप बना रहे हैं। उदाहरण के लिए, यदि आप कोई फ़ोटो या गेम इंटरफ़ेस प्रदर्शित कर रहे हैं, तो हो सकता है कि आप किसी भी तरह की पैडिंग न चाहें।
कालेब

3
ध्यान दें कि यह अंक में मापा गया मान लौटाता है। इसलिए यदि आप पिक्सेल में स्क्रीन रिज़ॉल्यूशन की उम्मीद कर रहे थे, तो परिणाम गलत होगा, और आपको परिणाम को गुणा करना चाहिए [UIScreen scale]
रोबॉटबग्स

3
किसी ने कहा कि जब से एक CGRect नकारात्मक चौड़ाई या ऊंचाई हो सकता है , हम का उपयोग करना चाहिए CGRectGetWidth()और CGRectGetHeight()बजाय सीधे पहुँचने का sizeआयत में क्षेत्र। मुझे नहीं लगता कि स्क्रीन आयत के संबंध में यह कभी भी एक समस्या है, लेकिन मुझे लगता है कि इसके बारे में पता होना कुछ है।
कालेब

64

सावधान, [यूआईस्क्रीन मेनस्क्रीन] में स्टेटस बार भी होता है, यदि आप अपने आवेदन के लिए फ्रेम को पुनः प्राप्त करना चाहते हैं (स्टेटस बार को छोड़कर) जिसका आपको उपयोग करना चाहिए

+ (CGFloat) window_height   {
    return [UIScreen mainScreen].applicationFrame.size.height;
}

+ (CGFloat) window_width   {
    return [UIScreen mainScreen].applicationFrame.size.width;
}

4
इरोस में पदावनत 9.0
जकारिया डारविश

6
चूँकि return [[UIScreen mainScreen] bounds].size.width;
ApplicationFrame

44

मैंने ऊपर दिए गए कुछ ऑब्जेक्टिव-सी उत्तरों का स्विफ्ट कोड में अनुवाद किया है। प्रत्येक अनुवाद को मूल उत्तर के संदर्भ में आगे बढ़ाया जाता है।

मुख्य उत्तर

let screen = UIScreen.main.bounds
let screenWidth = screen.size.width
let screenHeight = screen.size.height

सरल क्रिया उत्तर

func windowHeight() -> CGFloat {
    return UIScreen.mainScreen().applicationFrame.size.height
}

func windowWidth() -> CGFloat {
    return UIScreen.mainScreen().applicationFrame.size.width
}

डिवाइस ओरिएंटेशन उत्तर

var screenHeight : CGFloat
let statusBarOrientation = UIApplication.sharedApplication().statusBarOrientation
// it is important to do this after presentModalViewController:animated:
if (statusBarOrientation != UIInterfaceOrientation.Portrait
    && statusBarOrientation != UIInterfaceOrientation.PortraitUpsideDown){
    screenHeight = UIScreen.mainScreen().applicationFrame.size.width
} else {
    screenHeight = UIScreen.mainScreen().applicationFrame.size.height
}

उत्तर उत्तर दें

let screenWidth = UIScreen.mainScreen().bounds.size.width
let screenHeight = UIScreen.mainScreen().bounds.size.height
println("width: \(screenWidth)")
println("height: \(screenHeight)")

लगता है कि लॉग उत्तर में एक टाइपो है: क्या यह UIScreen.mainScreen ()। Bounds.size.width होना चाहिए? मुझे ".bounds" के बिना एक संकलन त्रुटि मिलती है।
पत्थर

@skypecakes मैंने ".bounds" को शामिल करने के लिए उत्तर निर्धारित किया है। प्रतिक्रिया के लिए धन्यवाद।
मार्टिन वूल्स्टनहल्मे

ApplicationFrame को iOS 9 और इसके बाद के संस्करण में पदावनत किया गया है,return UIScreen.mainScreen().bounds].size.width
Suhaib

39

मैंने पहले इन सुविधा विधियों का उपयोग किया है:

- (CGRect)getScreenFrameForCurrentOrientation {
    return [self getScreenFrameForOrientation:[UIApplication sharedApplication].statusBarOrientation];
}

- (CGRect)getScreenFrameForOrientation:(UIInterfaceOrientation)orientation {

    CGRect fullScreenRect = [[UIScreen mainScreen] bounds];

    // implicitly in Portrait orientation.
    if (UIInterfaceOrientationIsLandscape(orientation)) {
      CGRect temp = CGRectZero;
      temp.size.width = fullScreenRect.size.height;
      temp.size.height = fullScreenRect.size.width;
      fullScreenRect = temp;
    }

    if (![[UIApplication sharedApplication] statusBarHidden]) {
      CGFloat statusBarHeight = 20; // Needs a better solution, FYI statusBarFrame reports wrong in some cases..
      fullScreenRect.size.height -= statusBarHeight;
    }

    return fullScreenRect;
} 

अच्छा समाधान है, लेकिन सावधान रहना है कि अस्थायी अपरिभाषित मूल है।
szemian

4
क्या आपको डिफ़ॉल्ट के रूप में 0,0 मिलता है? जब मैंने फुलस्क्रीनस्क्रीन को लॉग किया, तो इसने मुझे दिया: {{8.03294e-35, 3.09816e-40}, {480, 320}}। मैंने CGRect टेम्प = CGRectZero के साथ इनिशियलाइज़ किया;
szemian

1
UIInterfaceOrientationIsLandscape 'UIDeviceOrientationFaceUp' और 'UIDeviceOrientationFaceDown' को हैंडल नहीं करता है जो UIDevice से वापस आ सकते हैं।
एंड्री

6
आप प्रॉपर्टी स्क्रीन का उपयोग करना पसंद कर सकते हैं। स्क्रीन के बजाय फ़ाइल का नाम बदलें। स्टेटस बार की देखभाल करता है।
गेरुड .ch

कुछ मामलों में मुड़ता है आवेदन सही रूप से घटाए गए स्टेटस बार (स्प्लिटव्यू से पूर्ण स्क्रीन मोडल) के साथ फ्रेम रिटर्न नहीं करता है
ल्यूक मैकेनीस

15

मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन कभी-कभी मुझे यह #define स्थिरांक जैसे उपयोगी लगते हैं, इसलिए मुझे इसके बारे में चिंता करने की ज़रूरत नहीं है:

#define DEVICE_SIZE [[[[UIApplication sharedApplication] keyWindow] rootViewController].view convertRect:[[UIScreen mainScreen] bounds] fromView:nil].size

उपर्युक्त स्थिरांक को उपकरण के उन्मुखीकरण से कोई फर्क नहीं पड़ता सही आकार वापस करना चाहिए। फिर आयाम प्राप्त करना उतना ही सरल है:

lCurrentWidth = DEVICE_SIZE.width;
lCurrentHeight = DEVICE_SIZE.height;

हो सकता है कि आप उत्तरबॉट के उत्तर पर मैक्रो को आधार बनाना चाहें क्योंकि यह सबसे अच्छा उत्तर लगता है।
grispeak

13

यह बहुत आसान है, अपने डिवाइस के आकार को प्राप्त करने के साथ-साथ अभिविन्यास को भी ध्यान में रखें:

// grab the window frame and adjust it for orientation
UIView *rootView = [[[UIApplication sharedApplication] keyWindow] 
                                   rootViewController].view;
CGRect originalFrame = [[UIScreen mainScreen] bounds];
CGRect adjustedFrame = [rootView convertRect:originalFrame fromView:nil];

नमस्ते, मैं इसे एक iPad परिदृश्य पर केवल app परिदृश्य में देखने के लिए उपयोग करता हूं, क्या कोई कारण है कि यह पहली बार सही मूल्य प्राप्त करता है, फिर मूल्य हर लोड पर 'के बाद फ़्लिप' करता है, अर्थात इसे पहले लैन्सस्केप के रूप में पढ़ता है, फिर मैं दूर और वापस देखने के लिए नेविगेट करें और यह चित्र के रूप में पढ़ने के लिए लगता है यहां तक ​​कि कोई अभिविन्यास परिवर्तन नहीं किया गया था? धन्यवाद
craigk

@LukeMcneice मेरे उत्पादन कोड में मुझे यह सुनिश्चित करने के लिए एक मुखर है कि एक फ्रेम पाया जाता है ... मेरे पास अभी तक उस दावे को विफल करने के लिए है। RootView और originalFrame के लिए क्या लौटाया जा रहा है?
मेमोन्स

मैं अभिविन्यास-सही चौड़ाई / ऊंचाई प्राप्त करने के लिए एक सिंगलटन में इस तकनीक का उपयोग कर रहा हूं। हालाँकि, यदि यह कोड चलता है जबकि एक UIAlert विंडो जो ConvertRect को दिखाती है समायोजित हो जाती है। आकार (चौड़ाई कम से कम) 0. किसी भी विचार के साथ क्या हो रहा है?
इलेक्ट्रो-बनी

आह। एक UIAlertViewKeyWindow के rootViewController दृश्य के रूप में खुद को सम्मिलित करेगा। मेरे पास तर्क है जो कोने के मामले से बचता है क्योंकि यदि कोई अलर्ट दृश्य है, तो उपयोगकर्ता कीबोर्ड के साथ बातचीत नहीं कर सकता है, इसलिए उस समय आमतौर पर कीबोर्ड फ्रेम को हथियाने की आवश्यकता नहीं होती है।
मेम्नों

अंतर्दृष्टि के लिए धन्यवाद। मैं आपकी तकनीक का उपयोग विज्ञापन बैनर सिंगलटन में कर रहा था। यह विज्ञापन को नए विज्ञापन के लिए स्क्रीन फ्रेम के आकार को बताने का एक सरल और अच्छा तरीका था। चूँकि मैं बैनर विज्ञापनों को पारस्परिक रूप से बाहर नहीं कर पाऊंगा और UIAlert की मैं संभवतः परिदृश्य / चित्र और जानवर बल का पता लगाने के लिए वापस गिर जाऊंगा।
इलेक्ट्रो-बन्नी

9

हमें डिवाइस के उन्मुखीकरण पर भी विचार करना होगा:

CGFloat screenHeight;
// it is important to do this after presentModalViewController:animated:
if ([[UIApplication sharedApplication] statusBarOrientation] == UIDeviceOrientationPortrait || [[UIApplication sharedApplication] statusBarOrientation] == UIDeviceOrientationPortraitUpsideDown){
    screenHeight = [UIScreen mainScreen].applicationFrame.size.height;
}
else{
    screenHeight = [UIScreen mainScreen].applicationFrame.size.width;
}

अच्छा उपाय मैंने यह किया कि मैं अपने iPad ऐप को एक मोडल वीसी को प्रस्तुत करते समय एक एम्बेडेड व्यू कंट्रोलर के अंदर से परिदृश्य में काम कर सकूँ।
स्टैकरनर


5

यहाँ मैंने स्विफ्ट 3 के लिए अपडेट किया है

एप्लीकेशनफ्रेम को आईओएस 9 से हटा दिया गया

स्विफ्ट तीन में उन्होंने हटा दिया है () और उन्होंने कुछ नामकरण सम्मेलन बदल दिए हैं, आप यहां लिंक का उल्लेख कर सकते हैं

func windowHeight() -> CGFloat {
    return UIScreen.main.bounds.size.height
}

func windowWidth() -> CGFloat {
    return UIScreen.main.bounds.size.width
}

4

आधुनिक उत्तर:

यदि आपका ऐप iPad पर स्प्लिट व्यू का समर्थन करता है, तो यह समस्या थोड़ी जटिल हो जाती है। आपको विंडो का आकार चाहिए, स्क्रीन का नहीं, जिसमें 2 ऐप्स हो सकते हैं। दौड़ते समय विंडो का आकार भी भिन्न हो सकता है।

ऐप की मुख्य विंडो का आकार उपयोग करें:

UIApplication.shared.delegate?.window??.bounds.size ?? .zero

नोट: ऊपर की विधि विंडो शुरू होने से पहले महत्वपूर्ण विंडो बनने से पहले गलत मान प्राप्त कर सकती है। यदि आपको केवल चौड़ाई की आवश्यकता है, तो नीचे दी गई विधि बहुत अनुशंसित है :

UIApplication.shared.statusBarFrame.width

उपयोग करने वाला पुराना समाधान UIScreen.main.boundsडिवाइस की सीमा को वापस कर देगा। यदि आपका ऐप स्प्लिट व्यू मोड में चल रहा है, तो यह गलत आयाम प्राप्त करता है।

self.view.window सबसे गर्म उत्तर में गलत आकार मिल सकता है जब ऐप में 2 या अधिक विंडो होती हैं और विंडो का आकार छोटा होता है।


4

Structsस्विफ्ट 3.0 में वर्तमान डिवाइस के बारे में उपयोगी जानकारी जानने के लिए इनका उपयोग करें

struct ScreenSize { // Answer to OP's question

    static let SCREEN_WIDTH         = UIScreen.main.bounds.size.width
    static let SCREEN_HEIGHT        = UIScreen.main.bounds.size.height
    static let SCREEN_MAX_LENGTH    = max(ScreenSize.SCREEN_WIDTH, ScreenSize.SCREEN_HEIGHT)
    static let SCREEN_MIN_LENGTH    = min(ScreenSize.SCREEN_WIDTH, ScreenSize.SCREEN_HEIGHT)

}

struct DeviceType { //Use this to check what is the device kind you're working with

    static let IS_IPHONE_4_OR_LESS  = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH < 568.0
    static let IS_IPHONE_SE         = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 568.0
    static let IS_IPHONE_7          = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 667.0
    static let IS_IPHONE_7PLUS      = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 736.0
    static let IS_IPHONE_X          = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 812.0
    static let IS_IPAD              = UIDevice.current.userInterfaceIdiom == .pad && ScreenSize.SCREEN_MAX_LENGTH == 1024.0

}


struct iOSVersion { //Get current device's iOS version

    static let SYS_VERSION_FLOAT  = (UIDevice.current.systemVersion as NSString).floatValue
    static let iOS7               = (iOSVersion.SYS_VERSION_FLOAT >= 7.0 && iOSVersion.SYS_VERSION_FLOAT < 8.0)
    static let iOS8               = (iOSVersion.SYS_VERSION_FLOAT >= 8.0 && iOSVersion.SYS_VERSION_FLOAT < 9.0)
    static let iOS9               = (iOSVersion.SYS_VERSION_FLOAT >= 9.0 && iOSVersion.SYS_VERSION_FLOAT < 10.0)
    static let iOS10              = (iOSVersion.SYS_VERSION_FLOAT >= 10.0 && iOSVersion.SYS_VERSION_FLOAT < 11.0)
    static let iOS11              = (iOSVersion.SYS_VERSION_FLOAT >= 11.0 && iOSVersion.SYS_VERSION_FLOAT < 12.0)
    static let iOS12              = (iOSVersion.SYS_VERSION_FLOAT >= 12.0 && iOSVersion.SYS_VERSION_FLOAT < 13.0)

}

3

यदि आप डिवाइस अभिविन्यास की परवाह किए बिना स्क्रीन की चौड़ाई / ऊँचाई चाहते हैं (चित्र आकार के लिए अच्छा है तो केवल परिदृश्य नियंत्रकों से लॉन्च होने वाले कंट्रोलर देखें):

CGFloat screenWidthInPoints = [UIScreen mainScreen].nativeBounds.size.width/[UIScreen mainScreen].nativeScale;
CGFloat screenHeightInPoints = [UIScreen mainScreen].nativeBounds.size.height/[UIScreen mainScreen].nativeScale;

[UIScreen mainScreen] .nativeBounds <- डॉक्स से -> पिक्सेल में मापी गई भौतिक स्क्रीन की बाउंडिंग आयत। यह आयत चित्र-अप अभिविन्यास में डिवाइस पर आधारित है। उपकरण के घूमने पर यह मान नहीं बदलता है।


2

यहाँ स्क्रीन आकार पाने के लिए एक स्विफ्ट तरीका है:

print(screenWidth)
print(screenHeight)

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



1

तेजी से 3.0

चौड़ाई के लिए

UIScreen.main.bounds.size.width

ऊंचाई के लिए

UIScreen.main.bounds.size.height

-2

आप इन मैक्रो को अपनी pch फ़ाइल में रख सकते हैं और प्रोजेक्ट में कहीं भी "SCREEN_WIDTH" का उपयोग करके उपयोग कर सकते हैं

#define SCREEN_WIDTH                ((([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) || ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown)) ? [[UIScreen mainScreen] bounds].size.width : [[UIScreen mainScreen] bounds].size.height)

और "SCREEN_HEIGHT"

#define SCREEN_HEIGHT               ((([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) || ([UIApplication sharedApplication].statusBarOrientation ==   UIInterfaceOrientationPortraitUpsideDown)) ? [[UIScreen mainScreen] bounds].size.height : [[UIScreen mainScreen] bounds].size.width)

उपयोग करने का उदाहरण:

CGSize calCulateSizze ;
calCulateSizze.width = SCREEN_WIDTH/2-8;
calCulateSizze.height = SCREEN_WIDTH/2-8;

क्या आप मार्कडाउन फॉर्मेट के अनुसार अपने कोड को इंडेंट कर सकते हैं? वर्तमान में यह समीक्षा पंक्ति में समुदाय उपयोगकर्ताओं द्वारा "निम्न गुणवत्ता" के रूप में चिह्नित किया गया था।
मनोज कुमार
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.