Hoe krijg ik de schermbreedte en -hoogte in iOS?

Hoe kan men de afmetingen van het scherm in iOS krijgen?

Momenteel gebruik ik:

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

in viewWillAppear: en willAnimateRotationToInterfaceOrientation:duration:

De eerste keer krijg ik de volledige schermgrootte. De tweede keer krijg ik het scherm minus de navigatiebalk.

Oplossing

Hoe kan men de afmetingen van het scherm in iOS krijgen?

Het probleem met de code die je gepost hebt is dat je erop rekent dat de grootte van de view overeenkomt met die van het scherm, en zoals je'hebt gezien is dat'niet altijd het geval. Als je de schermgrootte nodig hebt, moet je kijken naar het object dat het scherm zelf vertegenwoordigt, zoals dit:

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

Update voor gesplitste weergave: In opmerkingen, Dmitry vroeg:

Hoe kan ik de grootte van het scherm krijgen in de gesplitste weergave?

De code hierboven rapporteert de grootte van het scherm, zelfs in split screen mode. Wanneer u split screen mode gebruikt, verandert het venster van uw app's. Als de bovenstaande code je niet de informatie geeft die je verwacht, dan kijk je, net als de OP, naar het verkeerde object. In dit geval moet je echter naar het venster kijken in plaats van naar het scherm, zoals dit:

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

Swift 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
Commentaren (16)

Voorzichtig, [UIScreen mainScreen] bevat ook de statusbalk, als u het frame voor uw toepassing wilt ophalen (exclusief de statusbalk) moet u gebruik maken van

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

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

Ik heb deze gemaksmethoden eerder gebruikt:

- (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;
} 
Commentaren (8)