Hvordan få skjermbredden og høyden i iOS?

Hvordan kan man få dimensjonene på skjermen i iOS?

For øyeblikket bruker jeg:

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

in viewWillAppear: og willAnimateRotationToInterfaceOrientation:duration:

Den første gangen får jeg hele skjermstørrelsen. Den andre gangen får jeg skjermen minus navigeringslinjen.

Løsning

Hvordan kan man få dimensjonene på skjermen i iOS?

Problemet med koden du la ut er at du regner med at visningsstørrelsen samsvarer med skjermstørrelsen, og som du har sett er det ikke alltid tilfelle. Hvis du trenger skjermstørrelsen, bør du se på objektet som representerer selve skjermen, slik som dette:

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

Oppdatering for delt visning: I kommentarer spurte Dmitry:

Hvordan kan jeg få størrelsen på skjermen i delt visning?

Koden gitt ovenfor rapporterer størrelsen på skjermen, selv i delt skjermmodus. Når du bruker delt skjermmodus, endres appens vindu. Hvis koden ovenfor ikke gir deg den informasjonen du forventer, ser du i likhet med OP på feil objekt. I dette tilfellet bør du imidlertid se på vinduet i stedet for skjermen, slik som dette:

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
Kommentarer (16)

Forsiktig, [UIScreen mainScreen] inneholder også statuslinjen, hvis du vil hente rammen for applikasjonen din (unntatt statuslinjen), bør du bruke

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

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

Jeg har brukt disse bekvemmelighetsmetodene før:

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