ในแอพ iPhone วิธีตรวจจับความละเอียดหน้าจอของอุปกรณ์


130

ในแอพ iPhone ขณะเรียกใช้แอพบนอุปกรณ์จะตรวจจับความละเอียดหน้าจอของอุปกรณ์ที่แอพใดกำลังทำงานอยู่ได้อย่างไร

คำตอบ:


349
CGRect screenBounds = [[UIScreen mainScreen] bounds];

ซึ่งจะให้ความละเอียดของหน้าจอเป็นจุด ๆ ดังนั้นโดยทั่วไปแล้วจะเป็น 320x480 สำหรับ iPhone แม้ว่า iPhone4 จะมีขนาดหน้าจอที่ใหญ่กว่ามาก iOS ก็ยังให้กลับ 320x480 แทนที่จะเป็น 640x960 ส่วนใหญ่เป็นเพราะแอปพลิเคชันรุ่นเก่าทำลาย

CGFloat screenScale = [[UIScreen mainScreen] scale];

ซึ่งจะทำให้คุณได้ขนาดของหน้าจอ สำหรับอุปกรณ์ทั้งหมดที่ไม่มีจอแสดงผล Retina จะส่งคืน 1.0f ในขณะที่อุปกรณ์ Retina Display จะให้ 2.0f และ iPhone 6 Plus (Retina HD) จะให้ 3.0f

ตอนนี้หากคุณต้องการรับความกว้างและความสูงของพิกเซลของหน้าจออุปกรณ์ iOS คุณก็ต้องทำสิ่งง่ายๆเพียงอย่างเดียว

CGSize screenSize = CGSizeMake(screenBounds.size.width * screenScale, screenBounds.size.height * screenScale);

การคูณด้วยสเกลของหน้าจอคุณจะได้ความละเอียดของพิกเซลจริง

ดีอ่านบนความแตกต่างระหว่างคะแนนและพิกเซลใน iOS สามารถอ่านได้ที่นี่

แก้ไข: (เวอร์ชันสำหรับ Swift)

let screenBounds = UIScreen.main.bounds
let screenScale = UIScreen.main.scale
let screenSize = CGSize(width: screenBounds.size.width * screenScale, height: screenBounds.size.height * screenScale)

4
ยกเว้นว่านี่ไม่ใช่ความละเอียด 'พิกเซลจริง' ในกรณีของ iPhone 6 Plus ทุกอย่างมันมีความละเอียดจะแสดงผลที่ (ยกเว้น OpenGL) ในรหัสที่มีขนาด 3x แต่แล้วว่าจะลง-ตัวอย่างภายในเพื่อความละเอียดพื้นเมืองของหน้าจอ 1080 x 1920 หนึ่งในคำอธิบายที่ดีมากในการเชื่อมโยง
RobP

น่าเศร้าที่สิ่งนี้จะไม่ทำให้คุณมีขนาดขององค์ประกอบที่ "จริง" บนหน้าจอเนื่องจากแนวคิดของ Apple เกี่ยวกับ "คะแนน" และ "มาตราส่วน" เป็นเพียงการประมาณเท่านั้น (ดูรายละเอียด iPhone กับ iPad เทียบกับ iPad mini) น่าจะเป็นการลดจำนวนชุดค่าผสมต่างๆที่มีอยู่ ฉันคิดว่า iPhone 6 Plus อยู่ไกลเป็นพิเศษ
ToolmakerSteve

จริงๆแล้ว 6+ ไม่ไกลเกินไป: ความสูง 736 pts / 160 (pt / in) = 4.60 "ความสูงเชิงตรรกะความสูงของหน้าจอจริงคือ 4.79"; ข้อผิดพลาด 5% iPad อยู่ไกลกว่ามาก: ความสูง 1024 pts / 160 (pt / in) = 6.40 "ความสูงเชิงตรรกะความสูงของหน้าจอจริงคือ 7.76"; ข้อผิดพลาด 20% iPad มินิเป็น OK; ตรงกับความหนาแน่นของ iPhone ดั้งเดิม สำหรับวัตถุประสงค์ส่วนใหญ่นี่หมายความว่าเราควรทดสอบซอฟต์แวร์ iPad บน iPad mini (เพื่อให้แน่ใจว่าสามารถใช้งานได้) จากนั้นให้เพิกเฉยต่อข้อเท็จจริงที่ว่า iPad ส่วนใหญ่ขยายภาพได้ 20% (เทียบกับ iPhone หรือ iPad mini)
ToolmakerSteve

1
@RobP แล้วคุณจะแก้ปัญหานี้สำหรับ iPhone 6 Plus ได้อย่างไร?
Crashalot

1
@Crashalot ไม่แน่ใจว่า 'แก้ปัญหานี้' หมายถึงอะไร? ขึ้นอยู่กับวัตถุประสงค์ที่คุณมีในใจเมื่อคุณได้รับความละเอียดหน้าจอ เท่าที่โปรแกรมเมอร์กังวลคำตอบของ Jman012 นั้นถูกต้องและคุณแสดงผลเป็นช่องว่าง 1242x2208 หรือ 2208x1242 Heck นั่นคือความละเอียดที่เราให้ภาพเปิดตัวที่ ความจริงที่ว่าฮาร์ดแวร์ลงตัวอย่างภาพนี้และแสดงบนหน้าจอจริงที่มีจำนวนพิกเซลน้อยลงจะเป็น 'รายละเอียดการใช้งาน' ที่โค้ดของเราไม่ควรรับรู้ด้วยซ้ำ
RobP

21

คลาส UIScreen ช่วยให้คุณค้นหาความละเอียดของหน้าจอในจุดและพิกเซล

ความละเอียดหน้าจอวัดเป็นจุดหรือพิกเซล ไม่ควรสับสนกับขนาดหน้าจอ ขนาดหน้าจอที่เล็กลงอาจมีความละเอียดสูงขึ้น

'ขอบเขตความกว้าง' ของ UIScreen ส่งคืนขนาดสี่เหลี่ยมในจุด ป้อนคำอธิบายภาพที่นี่

'nativeBounds.width' ของ UIScreen ส่งคืนขนาดสี่เหลี่ยมเป็นพิกเซลค่านี้ตรวจพบเป็น PPI (จุดต่อนิ้ว) แสดงความคมชัดและความชัดเจนของภาพบนอุปกรณ์ ป้อนคำอธิบายภาพที่นี่

คุณสามารถใช้ UIScreen class เพื่อตรวจหาค่าเหล่านี้ทั้งหมด

Swift3

// Normal Screen Bounds - Detect Screen size in Points.
let width = UIScreen.main.bounds.width
let height = UIScreen.main.bounds.height
print("\n width:\(width) \n height:\(height)")

// Native Bounds - Detect Screen size in Pixels.
let nWidth = UIScreen.main.nativeBounds.width
let nHeight = UIScreen.main.nativeBounds.height
print("\n Native Width:\(nWidth) \n Native Height:\(nHeight)")

ปลอบใจ

width:736.0 
height:414.0

Native Width:1080.0 
Native Height:1920.0

สวิฟต์ 2.x

//Normal Bounds - Detect Screen size in Points.
    let width  = UIScreen.mainScreen.bounds.width
    let height = UIScreen.mainScreen.bounds.height

// Native Bounds - Detect Screen size in Pixels.
    let nWidth  = UIScreen.mainScreen.nativeBounds.width
    let nHeight = UIScreen.mainScreen.nativeBounds.height

objectivec

// Normal Bounds - Detect Screen size in Points.
CGFloat *width  = [UIScreen mainScreen].bounds.size.width;
CGFloat *height = [UIScreen mainScreen].bounds.size.height;

// Native Bounds - Detect Screen size in Pixels.
CGFloat *width  = [UIScreen mainScreen].nativeBounds.size.width
CGFloat *height = [UIScreen mainScreen].nativeBounds.size.width

8

ใช้ใน App Delegate: ฉันใช้สตอรี่บอร์ด

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {

    CGSize iOSDeviceScreenSize = [[UIScreen mainScreen] bounds].size;

    //----------------HERE WE SETUP FOR IPHONE 4/4s/iPod----------------------

    if(iOSDeviceScreenSize.height == 480){          

        UIStoryboard *iPhone35Storyboard = [UIStoryboard storyboardWithName:@"iPhone" bundle:nil];

        // Instantiate the initial view controller object from the storyboard
        UIViewController *initialViewController = [iPhone35Storyboard instantiateInitialViewController];

        // Instantiate a UIWindow object and initialize it with the screen size of the iOS device
        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

        // Set the initial view controller to be the root view controller of the window object
        self.window.rootViewController  = initialViewController;

        // Set the window object to be the key window and show it
        [self.window makeKeyAndVisible];

        iphone=@"4";

        NSLog(@"iPhone 4: %f", iOSDeviceScreenSize.height);

    }

    //----------------HERE WE SETUP FOR IPHONE 5----------------------

    if(iOSDeviceScreenSize.height == 568){

        // Instantiate a new storyboard object using the storyboard file named Storyboard_iPhone4
        UIStoryboard *iPhone4Storyboard = [UIStoryboard storyboardWithName:@"iPhone5" bundle:nil];

        // Instantiate the initial view controller object from the storyboard
        UIViewController *initialViewController = [iPhone4Storyboard instantiateInitialViewController];

        // Instantiate a UIWindow object and initialize it with the screen size of the iOS device
        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

        // Set the initial view controller to be the root view controller of the window object
        self.window.rootViewController  = initialViewController;

        // Set the window object to be the key window and show it
        [self.window makeKeyAndVisible];

         NSLog(@"iPhone 5: %f", iOSDeviceScreenSize.height);
        iphone=@"5";
    }

} else if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    // NSLog(@"wqweqe");
    storyboard = [UIStoryboard storyboardWithName:@"iPad" bundle:nil];

}

 return YES;
 }

5

สำหรับ iOS 8 เราสามารถใช้สิ่งนี้[UIScreen mainScreen].nativeBoundsได้ดังนี้:

- (NSInteger)resolutionX
{
    return CGRectGetWidth([UIScreen mainScreen].nativeBounds);
}

- (NSInteger)resolutionY
{
    return CGRectGetHeight([UIScreen mainScreen].nativeBounds);
}

4

ดูการอ้างอิงหน้าจอ UIS: http://developer.apple.com/library/ios/#documentation/uikit/reference/UIScreen_Class/Reference/UIScreen.html

if([[UIScreen mainScreen] respondsToSelector:NSSelectorFromString(@"scale")])
{
    if ([[UIScreen mainScreen] scale] < 1.1)
        NSLog(@"Standard Resolution Device");

    if ([[UIScreen mainScreen] scale] > 1.9)
        NSLog(@"High Resolution Device");
}

ขอบคุณสำหรับการตอบกลับหากฉันใส่ไว้ใน NSLog (@ "% d", [[UIScreen mainScreen] scale]); มันให้ 0 ...... และ NSLog (@ "% @", [[UIScreen mainScreen] scale]); มันให้ศูนย์กรุณาแจ้งให้เราทราบวิธีรับความละเอียดหน้าจอหรือวิธีทดสอบว่าให้ความละเอียดที่ถูกต้องหรือไม่ในขณะที่รันบนโปรแกรมจำลอง
ios

2
ลองNSLog(@"%f",[[UIScreen mainScreen] scale]);
vikingosegundo

0

ใช้รหัสนี้เพื่อช่วยในการรับความละเอียดหน้าจอของอุปกรณ์ทุกประเภท

 [[UIScreen mainScreen] bounds].size.height
 [[UIScreen mainScreen] bounds].size.width
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.