Crash podczas prezentacji UIImagePickerController pod iOS 6.0

Moja aplikacja obsługuje tylko orientacje poziome za pomocą właściwości supportedInterfaceOrientation.

Używając systemu iOS przed iOS 6, moja aplikacja może z powodzeniem załadować instancję UIImagePickerController za pomocą presentViewController:animated:completion:, nawet jeśli sama aplikacja UIImagePickerController obsługuje tylko orientację pionową.

[[8]} selektor obrazu po prostu przedstawił się użytkownikowi bokiem. Użytkownik obrócił telefon, wybrał swój obraz, a następnie obrócił się z powrotem do krajobrazu. W systemie iOS 6.0 wywołanie presentViewController:animated:completion:z instancją UIImagePickerController powoduje awarię aplikacji. Mogę aby zapobiec awarii, Dodaj opcje portretowe do moich właściwości supportedInterfaceOrientation.

Jednak praca w portrecie naprawdę nie ma sensu dla mojej aplikacji. Myślałem, że mogę użyć shouldAutorotateToInterfaceOrientation, aby zezwolić aplikacji na "obsługę portretu", ale tylko można obracać do portretu w tym jednym widoku. Ale teraz ta metoda jest przestarzała i nie mogę użyć tej samej techniki z shouldAutorotate.

Czy ktoś ma jakieś pomysły jak obejść ten problem pod iOS 6.0?

Author: Daniel, 2012-09-21

5 answers

IOS 6.1-fixed

Od iOS 6.1, to już nie występuje , bardzo ważne jest, aby postępować zgodnie z moimi wskazówkami, aby uniknąć awarii pod iOS 6.0.x, poniżej nadal się do tego odnosi.


IOS 6.0.x obejście

W rzeczywistości jest to błąd w iOS 6.0, który powinien zostać naprawiony w przyszłych wydaniach iOS.

Inżynier z Apple wyjaśnił ten błąd i obejście tutaj: https://devforums.apple.com/message/731764

To się dzieje ponieważ aplikacja chce tylko orientacji poziomej, ale niektóre kontrolery Cocoa Touch View wymagają orientacji ściśle pionowej, co jest błędem - nie to, że powinny wymagać więcej niż portret, ale ich interpretacja wymagań aplikacji.

Przykładem tego może być:

Aplikacja na iPada obsługująca krajobraz wyświetla tylko interfejs UIImagePickerController poprzez UIPopoverController. UIImagePickerController wymaga Orientacja portretowa, ale aplikacja wymusza tylko krajobraz. Błąd i... crash

Inne frameworki, które zostały zgłoszone jako problematyczne, to kontroler widoku logowania Game Center.

Obejście jest dość proste, ale nie idealne... Zachowujesz prawidłowe orientacje zadeklarowane w swoich informacjach.panel plist / project info, ale w klasie Delegat aplikacji deklarujesz, że zezwalasz na wszystkie orientacje.

Teraz każdy kontroler widoku, który dodajesz do okna, musi sam określić, że może / align = "left" / Sprawdź link, aby uzyskać więcej informacji.


Nie mogę podkreślić, jak bardzo nie powinieneś podklasyfikować UIImagePickerController, ponieważ przyjęte rozwiązanie nalega, abyś to zrobił.

Tutaj wpisz opis obrazka

Ważną rzeczą jest tutaj "Ta klasa jest przeznaczona do użycia jako-jest i nie obsługuje podklasowania ."


W moim przypadku dodałem to do delegata mojej aplikacji( mam tylko aplikację krajobraz), to mówi selektor obrazu może wyświetlać, ponieważ portret jest obsługiwane:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{
    return UIInterfaceOrientationMaskAll;
}

I wtedy w moim kontrolerze widoku, który akurat był UINavigationController, włączyłem kategorię o następującej treści:

- (NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskLandscape;
}

Teraz moja aplikacja nie obraca się, a selektor obrazu pyta delegata, czy może wyświetlać jako portret i dostaje informację, że jest w porządku. Więc wszystko gra dobrze.

 80
Author: Daniel,
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-30 18:04:29

Miałem podobny problem, ale w aplikacji krajobraz iPada. Prezentowałem selektora obrazów w pop-upie. Rozbił się pod iOS 6. Błąd sugerował, że próbnik chciał portret, ale aplikacja oferowała tylko widoki krajobrazowe i ... ważne ... / align = "center" bgcolor = "# e0ffe0 " / król Norwegii / / align = center /

Dodałem to do mojej ViewControllerClass.m, który tworzy selektor

@interface NonRotatingUIImagePickerController : UIImagePickerController

@end

@implementation NonRotatingUIImagePickerController

- (BOOL)shouldAutorotate
{
    return NO;
}

@end

A następnie użyłem tej klasy zamiast

UIImagePickerController *imagePicker = [[NonRotatingUIImagePickerController alloc] init];
[myPopoverController setContentViewController:imagePicker animated:YES];
To rozwiązało problem. Twoja sytuacja jest trochę inaczej, ale brzmi to jak zasadniczo ten sam błąd.
 41
Author: eclux,
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-21 03:39:33

Podczas podklasowania UIImagePickerController działa, kategoria jest lepszym rozwiązaniem:

    @implementation UIImagePickerController (NonRotating)

    - (BOOL)shouldAutorotate
    {
        return NO;
    }

    -(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
    {
        return UIInterfaceOrientationPortrait;
    }

    @end
 26
Author: JonahGabriel,
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-24 18:12:12

Raportowanie z iOS 7.1:

Oprócz tego, co określają powyższe odpowiedzi, wydaje się, że musisz bezwzględnie włączyć tryby portretowe w info.plist.

Bez tego żaden z powyższych kodów/poprawek nie zadziałał dla mnie.

 1
Author: Konstantinos Kontos,
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
2014-03-20 09:44:15
-(NSUInteger)supportedInterfaceOrientations
{
   return UIInterfaceOrientationMaskLandscape;
}

Naprawi problem, ale z iOs7

 1
Author: ANIL.MUNDURU,
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
2014-07-01 12:36:32