मुझे यह सही समस्या थी, और तुरंत पता चला कि ऑटोरोटेशन के बारे में बहुत सारी बुरी सलाह है, खासकर क्योंकि आईओएस 8 पिछले संस्करणों की तुलना में अलग-अलग है।
सबसे पहले, आप मैन्युअल रूप से प्रतिवाद लागू करना चाहते हैं या अभिविन्यास परिवर्तनों की सदस्यता लेना चाहते हैं।एक counterrotation करना अभी भी एक भयानक एनीमेशन होगा, और डिवाइस अभिविन्यास हमेशा इंटरफ़ेस अभिविन्यास के समान नहीं है। आदर्श रूप से आप कैमरे के पूर्वावलोकन को वास्तव में जमे हुए रहने के लिए चाहते हैं, और आपके ऐप यूआई स्टेटस बार अभिविन्यास और आकार से मेल खाते हैं, जैसे वे मूल कैमरा ऐप की तरह बदलते हैं।
आईओएस 8 में एक अभिविन्यास परिवर्तन के दौरान, खिड़की स्वयं दृश्य (दृश्यों) के बजाय घूमती है। आप एकाधिक दृश्य नियंत्रकों के विचारों को एक UIWindow
पर जोड़ सकते हैं, लेकिन केवल rootViewController
को shouldAutorotate()
के माध्यम से प्रतिक्रिया देने का अवसर मिलेगा। भले ही आप व्यू कंट्रोलर स्तर पर रोटेशन निर्णय लेते हैं, फिर भी यह मूल विंडो है जो वास्तव में घूमती है, इस प्रकार इसके सभी सबव्यूज़ (अन्य दृश्य नियंत्रकों के अलावा) को घुमाती है।
समाधान दो UIWindow
एक दूसरे के शीर्ष पर ढंका हुआ है, प्रत्येक घूर्णन (या नहीं) अपने स्वयं के रूट व्यू कंट्रोलर के साथ। अधिकांश ऐप्स में केवल एक होता है, लेकिन ऐसा कोई कारण नहीं है कि आपके पास दो और नहीं हो सकते हैं और उन्हें किसी अन्य UIView
सबक्लास की तरह ओवरले करें।
यहां एक कामकाजी प्रमाण-अवधारणा है, which I've also put on GitHub here। आपका विशेष मामला थोड़ा अधिक जटिल है क्योंकि आपके पास व्यू कंट्रोलर रखने का ढेर है, लेकिन मूल विचार समान है। मैं नीचे कुछ विशिष्ट बिंदुओं पर छूंगा।
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var cameraWindow: UIWindow!
var interfaceWindow: UIWindow!
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool {
let screenBounds = UIScreen.mainScreen().bounds
let inset: CGFloat = fabs(screenBounds.width - screenBounds.height)
cameraWindow = UIWindow(frame: screenBounds)
cameraWindow.rootViewController = CameraViewController()
cameraWindow.backgroundColor = UIColor.blackColor()
cameraWindow.hidden = false
interfaceWindow = UIWindow(frame: CGRectInset(screenBounds, -inset, -inset))
interfaceWindow.rootViewController = InterfaceViewController()
interfaceWindow.backgroundColor = UIColor.clearColor()
interfaceWindow.opaque = false
interfaceWindow.makeKeyAndVisible()
return true
}
}
interfaceWindow
पर एक नकारात्मक इनसेट स्थापना प्रभावी ढंग से आप मुखौटा अन्यथा देखना चाहते हैं काले आयताकार छुपा है, यह थोड़ा स्क्रीन सीमा से बड़ा बना देता है। आम तौर पर आप ध्यान नहीं देंगे क्योंकि मुखौटा खिड़की के साथ घूमता है, लेकिन जब से कैमरा खिड़की तय की जाती है तो रोटेशन के दौरान कोनों में मुखौटा दिखाई देता है।
class CameraViewController: UIViewController {
override func shouldAutorotate() -> Bool {
return false
}
}
वास्तव में आप यहाँ क्या उम्मीद थी, बस AVCapturePreviewLayer
के लिए अपने स्वयं के सेटअप जोड़ें।
class InterfaceViewController: UIViewController {
var contentView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
contentView = UIView(frame: CGRectZero)
contentView.backgroundColor = UIColor.clearColor()
contentView.opaque = false
view.backgroundColor = UIColor.clearColor()
view.opaque = false
view.addSubview(contentView)
}
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
let screenBounds = UIScreen.mainScreen().bounds
let offset: CGFloat = fabs(screenBounds.width - screenBounds.height)
view.frame = CGRectOffset(view.bounds, offset, offset)
contentView.frame = view.bounds
}
override func supportedInterfaceOrientations() -> Int {
return Int(UIInterfaceOrientationMask.All.rawValue)
}
override func shouldAutorotate() -> Bool {
return true
}
}
पिछले चाल नकारात्मक इनसेट हम खिड़की के लिए आवेदन किया है, जो हम view
offsetting एक ही राशि और मुख्य दृश्य के रूप में contentView
इलाज को प्राप्त नाश कर रहा है।
अपने अनुप्रयोग के लिए, interfaceWindow.rootViewController
अपने टैब बार नियंत्रक, जो बारी में एक नेविगेशन नियंत्रक होता है, आदि इन विचारों के सभी जब अपने कैमरे नियंत्रक दिखाई देता है तो कैमरा खिड़की के नीचे इसे माध्यम से दिखा सकते हैं पारदर्शी होने की जरूरत होगी। प्रदर्शन कारणों से आप उन्हें अपारदर्शी छोड़ने पर विचार कर सकते हैं और कैमरे वास्तव में उपयोग में होने पर केवल पारदर्शी होने के लिए सब कुछ सेट कर सकते हैं, और कैमरा विंडो को hidden
पर सेट कर सकते हैं जब यह नहीं है (कैप्चर सत्र को बंद करते समय)।
एक उपन्यास पोस्ट करने के लिए खेद है; मैंने इसे कहीं और संबोधित नहीं देखा है और मुझे पता लगाने में थोड़ी देर लग गई है, उम्मीद है कि यह आपको और किसी और को मदद करता है जो एक ही व्यवहार करने की कोशिश कर रहा है। यहां तक कि ऐप्पल का AVCam
नमूना ऐप भी इसे ठीक से संभाल नहीं करता है।
The example repo I posted में पहले से सेट किए गए कैमरे के साथ एक संस्करण भी शामिल है। सौभाग्य!
आप ViewControllerA से ViewControllerB धक्का कर रहे हैं? –
मैं इसे एक सबव्यूव के रूप में जोड़ रहा हूं। 'Self.view.addSubview (viewController.view)' – switz