w aplikacji iPhone Jak wykryć rozdzielczość ekranu urządzenia


131

W aplikacji na iPhone'a, podczas uruchamiania aplikacji na urządzeniu. Jak wykryć rozdzielczość ekranu urządzenia, na którym jest uruchomiona aplikacja?

Odpowiedzi:


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

To da ci rozdzielczość całego ekranu w punktach, więc najczęściej będzie to 320x480 dla iPhone'ów. Mimo że iPhone4 ma znacznie większy rozmiar ekranu, iOS nadal daje 320x480 zamiast 640x960. Dzieje się tak głównie z powodu awarii starszych aplikacji.

CGFloat screenScale = [[UIScreen mainScreen] scale];

To da ci skalę ekranu. W przypadku wszystkich urządzeń, które nie mają wyświetlaczy Retina, zwróci to 1,0f, podczas gdy urządzenia Retina Display dadzą 2,0f, a iPhone 6 Plus (Retina HD) - 3,0f.

Teraz, jeśli chcesz uzyskać szerokość i wysokość w pikselach ekranu urządzenia iOS, wystarczy zrobić jedną prostą rzecz.

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

Mnożąc przez skalę ekranu, otrzymasz rzeczywistą rozdzielczość w pikselach.

O różnicy między punktami i pikselami w iOS można przeczytać tutaj .

EDYCJA: (wersja dla 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
Tyle że nie jest to do końca „rzeczywista rozdzielczość pikseli” w przypadku iPhone'a 6 Plus. To rozdzielczości wszystko jest renderowane na (z wyjątkiem OpenGL) w kodzie, ze skalą 3x, ale potem , że jest w dół próbą wewnętrznie natywną rozdzielczością 1080 x 1920. Jednym z wielu dobrych wyjaśnień screena w linku
RobP

Niestety, nie daje to „prawdziwych” wymiarów elementów na ekranie, ponieważ pojęcia „punktów” i „skali” firmy Apple są jedynie przybliżeniem. (Zobacz specyfikacje dotyczące iPhone'a, iPada i iPada mini). Prawdopodobnie w celu zmniejszenia liczby różnych istniejących kombinacji. Myślę, że iPhone 6 Plus jest szczególnie daleko.
ToolmakerSteve

Właściwie 6+ niezbyt daleko: wysokość 736 pkt / 160 (pkt / cal) = 4,60 "wysokość logiczna; rzeczywista wysokość ekranu to 4,79"; 5% błędu. iPad jest znacznie dalej: wysokość 1024 pkt / 160 (pkt / cal) = 6,40 "wysokość logiczna; rzeczywista wysokość ekranu to 7,76"; 20% błąd. iPad mini jest w porządku; pasuje do oryginalnej gęstości iPhone'a. W większości przypadków oznacza to, że należy przetestować oprogramowanie iPada na iPadzie mini (aby upewnić się, że jest użyteczne), a następnie po prostu zignorować fakt, że większość iPadów powiększa obraz o 20% (w porównaniu do iPhone'a lub iPada mini).
ToolmakerSteve,

1
@RobP, jak więc rozwiązać ten problem w przypadku iPhone'a 6 Plus?
Crashalot

1
@ Crashalot nie jesteś pewien, co masz na myśli, mówiąc „rozwiąż to”? Zależy to od celu, jaki masz na myśli, uzyskując rozdzielczość ekranu. Jeśli chodzi o programistów, odpowiedź Jman012 jest poprawna i renderujesz do przestrzeni 1242x2208 lub 2208x1242. Heck, to nawet rozdzielczość, w której zapewniamy obrazy startowe. Fakt, że sprzęt następnie wyłącza się, próbkuje ten obraz i wyświetla go na fizycznym ekranie z mniejszą liczbą pikseli, byłby „szczegółem implementacji”, o którym nasz kod nie powinien nawet wiedzieć.
RobP

21

Klasa UIScreen umożliwia znalezienie rozdzielczości ekranu w punktach i pikselach.

Rozdzielczość ekranu jest mierzona w punktach lub pikselach. Nigdy nie należy go mylić z rozmiarem ekranu. Mniejszy rozmiar ekranu może mieć wyższą rozdzielczość.

„Bounds.width” UIScreen zwraca prostokątny rozmiar w punktach wprowadź opis obrazu tutaj

Funkcja „nativeBounds.width” programu UIScreen zwraca prostokątny rozmiar w pikselach. Wartość ta jest wykrywana jako PPI (punkt na cal). Pokazuje ostrość i wyrazistość obrazu na urządzeniu. wprowadź opis obrazu tutaj

Możesz użyć klasy UIScreen do wykrycia wszystkich tych wartości.

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)")

Konsola

width:736.0 
height:414.0

Native Width:1080.0 
Native Height:1920.0

Swift 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

Cel C

// 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

Użyj go w aplikacji delegata: używam scenorysu

- (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

W przypadku iOS 8 możemy po prostu użyć tego [UIScreen mainScreen].nativeBounds, na przykład:

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

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

4

Zobacz dokumentację UIScreen: 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");
}

dzięki za odpowiedź, jeśli umieszczam ją w NSLog (@ "% d", [[UIScreen mainScreen] skala]); daje 0 ...... i NSLog (@ "% @", [[UIScreen mainScreen] skala]); daje zero Pls daj mi znać, jak uzyskać rozdzielczość ekranu lub jak sprawdzić, czy daje poprawną rozdzielczość podczas uruchamiania go na symulatorze
ios

2
spróbujNSLog(@"%f",[[UIScreen mainScreen] scale]);
vikingosegundo

0

Użyj tego kodu, aby uzyskać dowolny typ rozdzielczości ekranu urządzenia

 [[UIScreen mainScreen] bounds].size.height
 [[UIScreen mainScreen] bounds].size.width
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.