Pracuję nad aplikacją fotograficzną, która umożliwia robienie zdjęć w orientacji pionowej lub poziomej. Ze względu na wymagania projektu nie mogę pozwolić autorotacji na orientację urządzenia, ale obrót musi być obsługiwany.Orientacja sterownika Force View w systemie iOS 9
Przy użyciu następujących metod Orientacja:
override func shouldAutorotate() -> Bool {
return true
}
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
if self.orientation == .Landscape {
return UIInterfaceOrientationMask.LandscapeRight
} else {
return UIInterfaceOrientationMask.Portrait
}
}
override func preferredInterfaceOrientationForPresentation() -> UIInterfaceOrientation {
if self.orientation == .Landscape {
return UIInterfaceOrientation.LandscapeRight
} else {
return UIInterfaceOrientation.Portrait
}
}
jestem w stanie ustawić rotację poprawnie na rynek. Zmieniając wartość orientacji i wywołując UIViewController.attemptRotationToDeviceOrientation()
jestem w stanie obsłużyć obrót do nowego pożądanego interfejsu. Jednak ten obrót występuje tylko wtedy, gdy użytkownik faktycznie przenosi swoje urządzenie. Potrzebuję tego automatycznie.
mogę zadzwonić: UIDevice.currentDevice().setValue(targetOrientation.rawValue, forKey: "orientation")
wymusić zmianę, ale to powoduje inne efekty uboczne, ponieważ UIDevice.currentDevice().orientation
zwraca tylko setValue od tego momentu. (i jest bardzo brudny)
Czy jest coś, czego mi brakuje? Przyjrzałem się zamykaniu i uruchamianiu nowego kontrolera widoku, ale ma to inne problemy, takie jak stały błąd interfejsu podczas zamykania i natychmiastowy prezentowanie nowego kontrolera widoku.
EDIT:
Następujące metody nie działa dla mnie:
- Trick preferredInterfaceOrientationForPresentation to fire on viewController change
- Forcing UIInterfaceOrientation changes on iPhone
EDIT 2:
Myśli o potencjalnych rozwiązań:
zestaw orientacja bezpośrednio (z
setValue
) i radzić sobie ze wszystkimi skutkami ubocznymi to przedstawia na iOS 9 (nie do przyjęcia)mogę korzystać z obecnego rozwiązania i wskazywać, że użytkownik musi obrócić urządzenie . Po fizycznym obróceniu urządzenia interfejs użytkownika obraca się, a następnie prawidłowo blokuje. (słaby interfejs użytkownika)
Mogę znaleźć rozwiązanie, które zmusza odświeżenie orientacji i obraca się bez fizycznego działania. (o co pytam i czego szukam)
Wykonuj wszystko ręcznie. Mogę zablokować interfejs w układzie pionowym lub poziomym, a także ręcznie obrócić i zmienić rozmiar widoku kontenera. Jest to "brudne", ponieważ powoduje rezygnację z wszystkich funkcji autolayout klasy wielkości i powoduje dużo cięższy kod. Próbuję tego uniknąć.
To jest odpowiedź typu Objective-C: http://stackoverflow.com/questions/2689598/forcing-uiinterfaceorientation-changes-on-iphone?rq=1, ale uważam, że interfejs API jest taki sam dla Swift; czy to zadziała dla ciebie? – fullofsquirrels
Byłoby to jednak, ale metody te są nieaktualne w iOS 9. Istnieje wiele rozwiązań, które kiedyś istniały, mam problem ze znalezieniem, który nadal działa. Nasze potrzeby są bardzo zdefiniowane i mają sens, ale są nieco sprzeczne z obecnym wzorcem (z powodu). W tym przypadku, pozwalanie użytkownikowi na wybór orientacji nie jest możliwe. –
Ha, właśnie zobaczyłem deprecation teraz, bummer. Czy Twój VC jest zawarty w kontrolerze nawigacyjnym lub pasku kart? Odpowiedź Korey'ego Hintona tutaj: http://stackoverflow.com/questions/26357162/how-to-force-view-controller-orientation-in-ios-8- próbuje rozwiązać ten konkretny przypadek, ale nie próbowałem go . – fullofsquirrels