Pytanie Jak przedstawić UIImagePickerController lub otworzyć kamerę w aplikacji tylko krajobrazu?


Tworzę aplikację działającą tylko w trybie poziomym.

Podczas rejestracji chcę otworzyć kamerę lub zaprezentować UIImagePickerController, ale aplikacja ulega awarii z następującym błędem:

*** Terminating app due to uncaught exception 'UIApplicationInvalidInterfaceOrientation', reason: 'Supported orientations has no common orientation with the application, and [PUUIAlbumListViewController shouldAutorotate] is returning YES'

Jak mogę przedstawić Próbnik obrazu lub Aparat w Pejzażu?


11
2018-01-25 07:12


pochodzenie




Odpowiedzi:


I found solution, case closed. i add in my appdelegate.m:

-(NSUInteger)application:(UIApplication *)application 
    supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
        return UIInterfaceOrientationMaskAll;
    else  /* iPad */
        return UIInterfaceOrientationMaskAllButUpsideDown;
}

5
2018-01-25 11:47



Rozwiązanie jest dobre, ale widzę, że nie ma awarii, ale aplikacja wyświetla tylko jedną czwartą części symulatora iPada po wyświetleniu podglądu. czy ten problem z symulatorem lub coś brakuje? - Yogesh Lolusare
Obraca się również w trybie pionowym i poziomym, zarówno ... nawet w aplikacjach tylko krajobrazowych. - shaqir saiyed
Dlaczego to rozwiązanie działa ...? Pytanie nie mówiło nic o byciu na iPadzie / iPhonie - fatuhoku
Naprawiono godziny i godziny bólu dzięki! - Keith Adler
część symulatora iPada po wyświetleniu podglądu, proszę rozwiązać ten problem utknąłem user1960279. - Pooja Srivastava


Miałem ten sam problem w iOS 9 i żadne z proponowanych przeze mnie rozwiązań (tutaj lub podobnych pytań na SO) nie zadziałało. Ale znalazłem rozwiązanie za pomocą UIPopoverPresentationController, który został wprowadzony w iOS 8. Robię to, w aplikacji, która jest tylko portret na iPhone, i krajobraz tylko na iPadzie. W delegacie mojej aplikacji mam to:

  func application(application: UIApplication,
      supportedInterfaceOrientationsForWindow window: UIWindow?)
      -> UIInterfaceOrientationMask {
    if UIDevice.currentDevice().userInterfaceIdiom == .Pad {
      return .Landscape
    } else {
      return .Portrait
    }
  }

Następnie w kontrolce widoku, która musi pokazywać próbnik zdjęć:

@IBAction func choosePictureFromLibrary() {
    let imagePickerController = UIImagePickerController()
    imagePickerController.delegate = self

    // Set the presentation style and grab the presentation controller,
    // which is created for you.
    imagePickerController.modalPresentationStyle = .Popover
    let presentationController = imagePickerController.popoverPresentationController

    // You must set a sourceView or barButtonItem so that it can 
    // draw a "bubble" with an arrow pointing at the right thing.
    presentationController?.sourceView = photoButton

    self.presentViewController(imagePickerController, animated: true) {}
  }

Używając .Popover Modalny styl prezentacji daje ładny, kompaktowy (w zasadzie wielkości iPhone'a) widok nakładający się na ekran iPada. Po uruchomieniu na telefonie iPhone działa on na pełnym ekranie jak normalny widok modalny.


4
2018-06-02 14:16



Dodatkowo musiałem podklasować UIImagePicker (gdy jest używany w układzie poziomym) i przesłonić var supportedInterfaceOrientations wracać [.landscape, .portrait] (iOS 10) - Matej Vargovčík


Rozwiązanie Swift 3, które działa zarówno na iPhone'a, jak i iPada

func openGallary(_ sender:UIButton)
    {
        imagepicker?.delegate = self
        imagepicker?.allowsEditing = false
        imagepicker!.sourceType = UIImagePickerControllerSourceType.photoLibrary
        if UIDevice.current.userInterfaceIdiom == .phone
        {
            self.present(imagepicker!, animated: true, completion: nil)
        }
        else
        {

            imagepicker?.modalPresentationStyle = .popover
            let presentationController = imagepicker?.popoverPresentationController
            // You must set a sourceView or barButtonItem so that it can
            // draw a "bubble" with an arrow pointing at the right thing.
            presentationController?.sourceView = sender
            self.present(imagepicker!, animated: true) {}
        }
    }

4
2018-04-11 07:06



Bardzo niedoceniany. Wielkie dzięki za to! - LinusGeffarth
tak .. Wysoce niedoceniona odpowiedź. - Talib Shabbir Hussain


Wdrożyć shouldAutorotate metoda:

- (BOOL)shouldAutorotate {
    UIInterfaceOrientation interfaceOrientation = [[UIApplication sharedApplication] statusBarOrientation];

    if (UIDeviceOrientationIsLandscape(interfaceOrientation)) {
        return YES;
    }
    return  NO;
}

This image shows the landscape orientation checked, you need to do the same

Dodaj ten kod do PUUIAlbumListViewController i wszystkie inne kontrolery widoku. Upewnij się, że zaznaczyłeś tylko krajobraz (krajobraz po lewej i krajobraz po prawej) w twoim celu.


-4
2018-01-25 08:06



Nie stworzyłem aplikacji klasy PUUIAlbumListViewController class.and nadal się zawiesza. - user1960279
wklej powyższy fragment kodu we wszystkich kontrolerach widoku, w tym PUUIAlbumListViewController. - Saif
Nie sądzę, aby wiele osób spoza Apple miało dostęp do PUUIAlbumListViewController, @saf - Departamento B