Aplikacje iOS 6 - Jak radzić sobie z rozmiarem ekranu iPhone ' a 5? [duplikat]

Możliwy duplikat:
Jak tworzyć lub migrować aplikacje na iPhone 5 Rozdzielczość ekranu?

Zastanawiałem się, jak powinniśmy sobie poradzić z iPhone 5 większy rozmiar ekranu.

Ponieważ ma więcej pikseli w wysokości, rzeczy takie jak GCRectMake, które używają współrzędnych (i właśnie podwoiły piksele z problemem siatkówki / nie siatkówki) nie będą działać bezproblemowo między wersjami, jak to się stało, gdy dostaliśmy Siatkówka.

I czy będziemy mieli zaprojektować dwa storyboardy, tak jak na iPada?

Osobiście nie sądzę, aby Apple wymagało od Ciebie sprawdzania rozmiaru ekranu za każdym razem, gdy musisz coś narysować, jak mówi wiele odpowiedzi. Czy to się dzieje z iPadem?

Author: Community, 2012-09-13

8 answers

Wszystkie aplikacje będą nadal działać na rozciągniętym pionowo ekranie z tego, co mogłem powiedzieć w dzisiejszej prezentacji. Będą one letterboxed lub w zasadzie dodatkowe 88 punktów wysokości będzie po prostu czarny.

Jeśli planujesz obsługiwać tylko iOS 6+, zdecydowanie rozważ użycie układu automatycznego. Usuwa wszystkie stałe obsługę układu i zamiast tego używa ograniczeń do układania rzeczy. Nic nie będzie zakodowane, a twoje życie stanie się o wiele prostsze.

Jednakże, jeśli musisz obsługa starszych systemów iOS, to naprawdę zależy od twojej aplikacji. Większość aplikacji, które używają standardowego paska nawigacyjnego i / lub paska kart, może po prostu rozwinąć zawartość w środku, aby wykorzystać dodatkowe punkty. Ustawia maskę automatyzującą zawartość środkową, aby rozwijała się w obu kierunkach.

view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

To działa świetnie po wyjęciu z pudełka dla widoków tabeli, jednak jeśli aplikacja używała pikseli idealny układ do wyświetlania treści, wtedy najlepiej byłoby ponownie wyobrazić zawartość tak, że to może pomieścić różne wysokości.

Jeśli nie jest to możliwe, jedyną pozostałą opcją jest posiadanie dwóch interfejsów użytkownika (pre iPhone 5 i iPhone 5).

Jeśli to brzmi brzydko, możesz wybrać domyślny model z pudełkami na listy, w którym dodatkowe punkty / piksele wyświetlają się na czarno.

Edit

Aby włączyć aplikacje do pracy z iPhone 5, musisz dodać wersję retina obrazu launchera. Powinien mieć nazwę [email protected]. I to musi być jakość siatkówki - nie ma kompatybilność wsteczna tutaj:)

Można również wybrać ten obraz z Xcode. Przejdź do celu i w sekcji Podsumowanie poszukaj obrazów uruchamiania. Obraz musi mieć rozmiar 640x1136 pikseli. Oto zrzut ekranu, gdzie go znaleźć, jeśli to pomoże.

Zrzut ekranu Xcode

 209
Author: Anurag,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-17 08:55:42

Musisz dodać 640x1136 pikseli PNG image ([email protected]) jako 4-calowy domyślny obrazek powitalny twojego projektu, a będzie on używał dodatkowych spacji (bez wysiłku w prostych aplikacjach opartych na tabelach, gry będą wymagały więcej wysiłku).

Stworzyłem małą kategorię UIDevice, aby poradzić sobie ze wszystkimi rozdzielczością ekranu. Możesz dostać go tutaj , ale kod jest następujący:

Plik UIDevice+Uchwały.h :

enum {
    UIDeviceResolution_Unknown           = 0,
    UIDeviceResolution_iPhoneStandard    = 1,    // iPhone 1,3,3GS Standard Display  (320x480px)
    UIDeviceResolution_iPhoneRetina4    = 2,    // iPhone 4,4S Retina Display 3.5"  (640x960px)
    UIDeviceResolution_iPhoneRetina5     = 3,    // iPhone 5 Retina Display 4"       (640x1136px)
    UIDeviceResolution_iPadStandard      = 4,    // iPad 1,2,mini Standard Display   (1024x768px)
    UIDeviceResolution_iPadRetina        = 5     // iPad 3 Retina Display            (2048x1536px)
}; typedef NSUInteger UIDeviceResolution;

@interface UIDevice (Resolutions)

- (UIDeviceResolution)resolution;

NSString *NSStringFromResolution(UIDeviceResolution resolution);

@end

Plik UIDevice + Rezolucje.m :

#import "UIDevice+Resolutions.h"

@implementation UIDevice (Resolutions)

- (UIDeviceResolution)resolution
{
    UIDeviceResolution resolution = UIDeviceResolution_Unknown;
    UIScreen *mainScreen = [UIScreen mainScreen];
    CGFloat scale = ([mainScreen respondsToSelector:@selector(scale)] ? mainScreen.scale : 1.0f);
    CGFloat pixelHeight = (CGRectGetHeight(mainScreen.bounds) * scale);

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone){
        if (scale == 2.0f) {
            if (pixelHeight == 960.0f)
                resolution = UIDeviceResolution_iPhoneRetina4;
            else if (pixelHeight == 1136.0f)
                resolution = UIDeviceResolution_iPhoneRetina5;

        } else if (scale == 1.0f && pixelHeight == 480.0f)
            resolution = UIDeviceResolution_iPhoneStandard;

    } else {
        if (scale == 2.0f && pixelHeight == 2048.0f) {
            resolution = UIDeviceResolution_iPadRetina;

        } else if (scale == 1.0f && pixelHeight == 1024.0f) {
            resolution = UIDeviceResolution_iPadStandard;
        }
    }

    return resolution;
 }

 @end

W ten sposób musisz użyć tego kodu.

1) Dodaj powyższe rozdzielczości UIDevice+.H & UIDevice+uchwały.pliki m do twojego projektu

2) Dodaj linię # import " UIDevice+rozdzielczości.h " do kontrolera ViewController.m

3) Dodaj ten kod, aby sprawdzić, z jakimi wersjami urządzenia masz do czynienia

int valueDevice = [[UIDevice currentDevice] resolution];

    NSLog(@"valueDevice: %d ...", valueDevice);

    if (valueDevice == 0)
    {
        //unknow device - you got me!
    }
    else if (valueDevice == 1)
    {
        //standard iphone 3GS and lower
    }
    else if (valueDevice == 2)
    {
        //iphone 4 & 4S
    }
    else if (valueDevice == 3)
    {
        //iphone 5
    }
    else if (valueDevice == 4)
    {
        //ipad 2
    }
    else if (valueDevice == 5)
    {
        //ipad 3 - retina display
    }
 84
Author: Peter Mortensen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-12 17:10:26

[13]} właśnie skończyłem aktualizować i wysyłać do sklepu wersję iOS 6.0 jednej z Moich aplikacji. Ta wersja jest wstecznie kompatybilna z iOS 5.0, dlatego zachowałem metodę shouldAutorotateToInterfaceOrientation: i Dodałem nowe, jak wymieniono poniżej.

Musiałem zrobić:

Autorotacja zmienia się w iOS 6. W iOS 6 metoda shouldAutorotateToInterfaceOrientation: UIViewController jest przestarzała. W jego miejsce należy użyć metod supportedInterfaceOrientationsForWindow: i shouldAutorotate. Dlatego dodałem te nowe metody (i zachowałem stare Dla iOS 5 zgodność):

- (BOOL)shouldAutorotate {
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskAllButUpsideDown;    
}
  • użyto metody kontrolera widoku viewWillLayoutSubviews i dostosowano układ za pomocą prostokąta obramowania widoku.
  • Modal view controllers: The willRotateToInterfaceOrientation:duration:,
    willAnimateRotationToInterfaceOrientation:duration:, oraz
    didRotateFromInterfaceOrientation: metody nie są już wywoływane każdy kontroler widoku , który tworzy pełnoekranową prezentację
    siebie
    -na przykład presentViewController:animated:completion:.
  • następnie naprawiłem autolayout dla widoków, które tego potrzebowały.
  • skopiowane obrazy z symulatora do widoku startowego i widoki dla iTunes store do Photoshopa i wyeksportowane je jako pliki png.
  • nazwa domyślnego obrazu to: [email protected], a rozmiar to 640×1136. Pozwalał również na dostarczanie 640×1096 dla tego samego trybu portretowego (usunięto pasek stanu). Podobne rozmiary mogą być również dostarczane w trybie poziomym, jeśli aplikacja umożliwia orientację poziomą tylko na iPhonie.
  • porzuciłem kompatybilność wsteczną dla iOS 4. Głównym powodem tego jest to, że wsparcie dla armv6 kodu zostało porzucone. Tak więc wszystkie urządzenia, które jestem w stanie obsługiwać teraz (działa armv7), można uaktualnić do iOS 5.
  • jestem również generowanie armv7s kod do obsługi iPhone 5 i tym samym może nie używaj frameworków innych firm (jak Admob itp.) dopóki nie zostaną aktualizacja.

To wszystko, ale pamiętaj, aby przetestować autorotację w iOS 5 i iOS 6 ze względu na zmiany w rotacji.

 56
Author: Hannes Sverrisson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-25 11:18:14

Nie.

if ([[UIScreen mainScreen] bounds].size.height > 960)

Na iPhone 5 jest źle

if ([[UIScreen mainScreen] bounds].size.height == 568)
 26
Author: user1406691,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-15 22:55:27
@interface UIDevice (Screen)
typedef enum
{
    iPhone          = 1 << 1,
    iPhoneRetina    = 1 << 2,
    iPhone5         = 1 << 3,
    iPad            = 1 << 4,
    iPadRetina      = 1 << 5

} DeviceType;

+ (DeviceType)deviceType;
@end

.m

#import "UIDevice+Screen.h"
@implementation UIDevice (Screen)

+ (DeviceType)deviceType
{
    DeviceType thisDevice = 0;
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
    {
        thisDevice |= iPhone;
        if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)])
        {
            thisDevice |= iPhoneRetina;
            if ([[UIScreen mainScreen] bounds].size.height == 568)
                thisDevice |= iPhone5;
        }
    }
    else
    {
        thisDevice |= iPad;
        if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)])
            thisDevice |= iPadRetina;
    }
    return thisDevice;
}

@end

W ten sposób, jeśli chcesz wykryć, czy jest to tylko iPhone czy iPad( niezależnie od rozmiaru ekranu), po prostu użyj:

if ([UIDevice deviceType] & iPhone) 

Lub

if ([UIDevice deviceType] & iPad)

Jeśli chcesz wykryć tylko iPhone 5, możesz użyć

if ([UIDevice deviceType] & iPhone5)
W przeciwieństwie do odpowiedzi Malcoms, gdzie trzeba by sprawdzić, czy to iPhone,]}
if ([UIDevice currentResolution] == UIDevice_iPhoneHiRes || 
    [UIDevice currentResolution] == UIDevice_iPhoneStandardRes || 
    [UIDevice currentResolution] == UIDevice_iPhoneTallerHiRes)`
Żadna ze stron nie ma nad sobą większej przewagi, jest tylko osobistą preferencją.
 17
Author: endy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-15 22:54:55

Komentarz@Pascala do pytania OP jest słuszny. Po prostu dodając obraz, usuwa czarne obramowania i aplikacja będzie korzystać z pełnej wysokości.

Będziesz musiał dokonać korekt w dowolnych Cgrectach, stwierdzając, że urządzenie korzysta z większego wyświetlacza. Czyli jeśli potrzebujesz czegoś wyrównanego do dołu ekranu.

Jestem pewien, że istnieje wbudowana metoda, ale nic nie widziałem i wiele jest nadal pod NDA, więc metoda, której używamy w naszych aplikacjach, jest po prostu globalna funkcja. Dodaj do swojego .plik pch, a następnie jego proste if( is4InchRetina() ) { ... } wywołanie, aby wprowadzić poprawki do CGRects itp.

static BOOL is4InchRetina()
{
    if (![UIApplication sharedApplication].statusBarHidden && (int)[[UIScreen mainScreen] applicationFrame].size.height == 548 || [UIApplication sharedApplication].statusBarHidden && (int)[[UIScreen mainScreen] applicationFrame].size.height == 568)
        return YES;

    return NO;
}
 5
Author: Byron Rode,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-17 02:40:23

Myślę, że możesz użyć [UIScreen mainScreen].bounds.size.height i obliczyć krok dla swoich obiektów. podczas obliczania kroku można ustawić Współrzędne dla dwóch rozdzielczości.

Lub możesz uzyskać wysokość jak powyżej i if(iphone5) then... else if(iphone4) then... else if(ipad). Coś w tym stylu.

Jeśli używasz storyboardów, musisz utworzyć nowy dla nowego iPhone ' a.

 3
Author: Tomasz Szulc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-12 21:44:45

Ponieważ ma więcej pikseli w wysokości, rzeczy takie jak GCRectMake, które używają współrzędnych nie będą działać bezproblemowo między wersjami, jak to się stało, gdy dostaliśmy siatkówkę.

Cóż, one działają tak samo z wyświetlaczami Retina - chodzi o to, że 1 jednostka w układzie współrzędnych CoreGraphics odpowiada 2 fizycznym pikselom, ale nie musisz/nie musisz nic robić, logika pozostała taka sama. (Czy rzeczywiście próbowałeś uruchomić jedną z aplikacji innych niż siatkówka na iPhonie siatkówka, Nigdy?)

Na prawdziwe pytanie: dlatego nie powinieneś używać jawnego CGRectMakes and co... Dlatego masz takie rzeczy jak [[UIScreen mainScreen] applicationFrame].

 3
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-12 21:45:53