ios - full - अभिविन्यास-निर्भर ऊंचाई और स्क्रीन की चौड़ाई कैसे प्राप्त करें?




ios in hindi (7)

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

CGRect screenRect = [[UIScreen mainScreen] bounds];

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


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

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


आईओएस 8 स्क्रीन सीमाओं के रूप में अब वर्तमान अभिविन्यास के लिए सही लौटा दिया गया है। इसका अर्थ है लैंडस्केप ओरिएंटेशन [यूआईस्क्रीन मेनस्क्रीन] में आईपैड। आईओएस 8 पर आईओएस <= 7 और 1024 पर 768 वापस आ जाएगा।

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

-(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 ;
}

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

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

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

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

सारांश

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

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

लिंक

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

कार्य कोड

मैं आमतौर पर इसे दूर नहीं जाता हूं, लेकिन आपने मेरी रुचि पिक्चर की है। निम्नलिखित कोड चाल करना चाहिए। मैंने यूआईपीप्लिकेशन पर एक श्रेणी लिखी। मैंने किसी दिए गए अभिविन्यास में वर्तमान आकार या आकार प्राप्त करने के लिए कक्षा विधियों को जोड़ा, जो आप 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] उपयोग करने के लिए। इसके अलावा, मैंने उपर्युक्त कोड चलाया, इसलिए मुझे पता है कि यह काम करता है और सभी ओरिएंटेशन में सही प्रतिक्रियाओं को वापस रिपोर्ट करता है। ध्यान दें कि मैं स्टेटस बार में कारक हूं। दिलचस्प बात यह है कि मुझे स्टेटस बार की ऊंचाई और चौड़ाई के MIN को घटा देना पड़ा।

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

अन्य विचार

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

(जीडीबी) पीओ [[[[यूआईएपीप्लिकेशन साझा अनुप्रयोग] keyWindow] rootViewController] देखें]

<UILayoutContainerView: 0xf7296f0; फ्रेम = (0 0; 320 480); परिवर्तन = [0, -1, 1, 0, 0, 0]; autoresize = डब्ल्यू + एच; परत = <कैलियर: 0xf729b80 >>

(जीडीबी) पीओ [[[[यूआईएपीप्लिकेशन साझा अनुप्रयोग] keyWindow] rootViewController] देखें]

<UILayoutContainerView: 0xf7296f0; फ्रेम = (0 0; 320 480); autoresize = डब्ल्यू + एच; परत = <कैलियर: 0xf729b80 >>

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

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


मैंने 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

यह मेरा समाधान कोड है! यह विधि 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 ;
}

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

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

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

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

#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)

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());




ios