Cara mendapatkan layar lebar dan tinggi di iOS?

Bagaimana seseorang bisa mendapatkan dimensi layar di iOS?

Saat ini, saya menggunakan:

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

di viewWillAppear: dan willAnimateRotationToInterfaceOrientation:durasi:

Pertama kali saya mendapatkan seluruh ukuran layar. Kedua kalinya saya mendapatkan layar minus nav bar.

Larutan

Bagaimana seseorang bisa mendapatkan dimensi layar di iOS?

Masalah dengan kode yang anda diposting adalah bahwa anda're mengandalkan lihat ukuran untuk mencocokkan bahwa layar, dan seperti yang anda've terlihat bahwa's tidak selalu terjadi. Jika anda membutuhkan ukuran layar, anda harus melihat pada objek yang merupakan layar itu sendiri, seperti ini:

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

Update untuk split view: Di komentar, Dmitry bertanya:

Bagaimana saya bisa mendapatkan ukuran layar dalam tampilan split?

Kode yang diberikan atas laporan ukuran layar, bahkan dalam modus layar split. Ketika anda menggunakan modus layar split, aplikasi's jendela perubahan. Jika kode di atas tidak't memberikan anda informasi yang anda harapkan, maka suka OP, anda're melihat objek yang salah. Dalam hal ini, meskipun, anda harus melihat pada jendela bukan layar seperti ini:

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

Hati-hati, [UIScreen mainScreen] berisi status bar juga, jika anda ingin mengambil bingkai untuk aplikasi anda (termasuk status bar), anda harus menggunakan

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

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

I've diterjemahkan beberapa hal di atas Objective-C jawaban ke kode Swift. Setiap terjemahan melanjutkan dengan mengacu pada jawaban asli.

Utama

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

Fungsi sederhana Jawaban

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

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

Perangkat Orientasi Jawaban

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
}

Log Jawaban

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

Saya telah menggunakan ini selama metode sebelumnya:

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

Saya menyadari bahwa ini adalah sebuah posting lama, tapi kadang-kadang saya menemukan itu berguna untuk #mendefinisikan konstanta seperti ini jadi saya tidak perlu khawatir tentang hal itu:

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

Di atas konstan harus kembali ukuran yang benar tidak peduli orientasi perangkat. Kemudian mendapatkan dimensi adalah yang sederhana seperti:

lCurrentWidth = DEVICE_SIZE.width;
lCurrentHeight = DEVICE_SIZE.height;
Komentar (1)

It's sangat, sangat mudah untuk mendapatkan ukuran perangkat as baik as memperhitungkan orientasi:

// 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];
Komentar (7)

Kita harus mempertimbangkan orientasi perangkat juga:

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;
}
Komentar (1)
NSLog(@"%.0f", [[UIScreen mainScreen] bounds].size.width);
NSLog(@"%.0f", [[UIScreen mainScreen] bounds].size.height);
Komentar (0)

Di sini saya telah diperbarui untuk swift 3

applicationFrame usang dari iOS 9

Di swift tiga mereka telah dihapus () dan mereka telah mengubah beberapa konvensi penamaan, anda bisa lihat di sini Link

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

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

Membuat penggunaan ini Struct untuk mengetahui info berguna tentang perangkat saat ini di Swift 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)

}
Komentar (0)

Jika anda ingin layar lebar/tinggi terlepas dari orientasi perangkat (baik untuk ukuran hanya portrait view controller yang diluncurkan dari orientasi landscape):

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

[UIScreen mainScreen].nativeBounds <-- Dari dokumen --> bounding rectangle dari layar fisik, diukur dalam piksel. Persegi panjang ini didasarkan pada perangkat di potret-up orientasi. Nilai ini tidak berubah sebagai perangkat berputar.

Komentar (0)

Berikut ini adalah cara Cepat untuk mendapatkan ukuran layar:

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
}

Ini adalah termasuk sebagai fungsi standar dalam:

https://github.com/goktugyil/EZSwiftExtensions

Komentar (0)

Modern menjawab:

jika aplikasi anda mendukung tampilan split di iPad, masalah ini menjadi sedikit rumit. Yang anda butuhkan jendela's ukuran, tidak layar's, yang mungkin berisi 2 aplikasi. Jendela's ukuran juga bervariasi sementara berjalan.

Gunakan aplikasi's jendela utama's ukuran:

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

Catatan: metode di atas dapat mendapatkan salah nilai sebelum jendela menjadi kunci jendela ketika memulai. jika anda hanya membutuhkan lebar, metode di bawah ini sangat fitur:

UIApplication.shared.statusBarFrame.width

Solusi tua menggunakan UIScreen.utama.batas akan kembali perangkat's batas. Jika anda menjalankan aplikasi dalam mode tampilan split, itu salah dimensi.

diri.lihat.jendela dalam terpanas jawabannya mungkin mendapatkan ukuran yang salah ketika aplikasi berisi 2 atau lebih jendela dan jendela memiliki ukuran kecil.

Komentar (0)

CGFloat width = [[UIScreen mainScreen] batas].ukuran.lebar; CGFloat height = [[UIScreen mainScreen]batas ].ukuran.tinggi;

Komentar (0)

swift 3.0

untuk lebar

UIScreen.main.bounds.size.width

untuk tinggi

UIScreen.main.bounds.size.height
Komentar (0)

Anda dapat menempatkan macro ini anda pch file dan digunakan di mana saja dalam proyek dengan menggunakan "SCREEN_WIDTH"

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

dan "SCREEN_HEIGHT"

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

Contoh penggunaan:

CGSize calCulateSizze ;
calCulateSizze.width = SCREEN_WIDTH/2-8;
calCulateSizze.height = SCREEN_WIDTH/2-8;
Komentar (1)