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.
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;
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
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;
}
I've diterjemahkan beberapa hal di atas Objective-C jawaban ke kode Swift. Setiap terjemahan melanjutkan dengan mengacu pada jawaban asli.
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)")
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;
}
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;
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];
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;
}
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
}
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)
}
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.
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:
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.
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;