नया iOS 13 मोडल प्रस्तुति: प्रस्तुतकर्ता नियंत्रक नीचे नहीं जाएगा


11

जब मैं iOS 13 में UIViewControllers को औपचारिक रूप से पेश कर रहा हूं तो मेरे पास एक अजीब व्यवहार है। नई प्रस्तुति शैली जिसे मैंने पूरे iOS 13 में देखा है वह इस प्रकार है:

प्रस्तुत दृश्य नियंत्रक प्रस्तुत दृश्य नियंत्रक के पीछे दिखाई देता है। इसे "स्टैक" की नकल करने के लिए भी स्थानांतरित किया गया है

प्रस्तुत दृश्य नियंत्रक प्रस्तुत दृश्य नियंत्रक के पीछे दिखाई देता है।  इसे "स्टैक" की नकल करने के लिए भी स्थानांतरित किया गया है

इस बीच, जब मैं अपने ऐप के माध्यम से व्यू कंट्रोलर प्रस्तुत करता हूं, तो मुझे यह प्रभाव मिलता रहता है:

प्रस्तुत करने वाला व्यू कंट्रोलर नए व्यू कंट्रोलर को प्रस्तुत करते समय बिल्कुल भी हिलता नहीं है

प्रस्तुत करने वाला व्यू कंट्रोलर नए व्यू कंट्रोलर को प्रस्तुत करते समय बिल्कुल भी हिलता नहीं है

मैं इस कोड को इस दृश्य नियंत्रक को प्रस्तुत करने के लिए उपयोग करता हूं:

let controller = storyboard?.instantiateViewController(withIdentifier: "tutorial") as! TutorialController
controller.modalPresentationStyle = .pageSheet
controller.modalTransitionStyle = .coverVertical
present(controller, animated: true, completion: nil)

यहां मेरा प्रश्न है: मैं सोच रहा हूं कि ऐसा क्यों हो रहा है और अगर सामान्य iOS 13 शैली में दृश्य नियंत्रकों को पेश करने का एक तरीका है (प्रस्तुत करने वाले दृश्य नियंत्रक के साथ वापस जाना)।

अग्रिम में धन्यवाद!


एक परीक्षण के रूप में, controller.modalTransitionStyle = .coverVerticalऔर यहां तक ​​कि controller.modalPresentationStyle = .pageSheet(भले ही यह कोड एक iPad पर भी चलाया जाता है) प्रस्तुति शैली की आवश्यकता होगी।
अद्र्धवार्षिक

मैंने इसे टिप्पणी की, लेकिन यह कुछ भी नहीं बदलता है :(
सेंट्रमग्यू

जवाबों:


3

समस्या यह है कि मेरे विचार नियंत्रक पदानुक्रम था। मैं अपने ऐप के रूट व्यू कंट्रोलर को प्रस्तुत करने वाले व्यू कंट्रोलर बनाकर इसे ठीक करने में सक्षम था। पहले मैंने बैकग्राउंड कंट्रोलर को कॉल करके रूट व्यू कंट्रोलर के रूप में सेट किया

window.rootViewController = self

और फिर मेरे पिछले कोड का उपयोग कर

let controller = storyboard?.instantiateViewController(withIdentifier: "tutorial") as! TutorialController
controller.modalPresentationStyle = .pageSheet
controller.modalTransitionStyle = .coverVertical
present(controller, animated: true, completion: nil)

मैंने व्यू कंट्रोलर प्रस्तुत किया। उन सभी को धन्यवाद जिन्होंने मदद करने की कोशिश की!


मुझे भी यही समस्या हो रही है। आपने rootViewController ध्वज कहाँ स्थापित किया था? बहस से ठीक पहले?
पावेल ज़गोडा-फ़र्क्मिन

मैंने इसे तब सेट किया जब मैंने "पृष्ठभूमि नियंत्रक" प्रस्तुत किया। आइए उन्हें चीजों को आसान बनाने के लिए 1, 2, और 3 को कंट्रोलर कहते हैं (1 पीठ में सबसे पीछे वाला हिस्सा है, 2 पीछे 3 पृष्ठभूमि में है, और 3 सामने वाला उर्फ ​​ट्यूटोरियल कंट्रोलर है)। हम वर्तमान में नियंत्रक 1 को देख रहे हैं। नियंत्रक 2 को प्रस्तुत करने के लिए वर्तमान () को कॉल करने के बजाय, मैं नियंत्रक 2 को मूल दृश्य नियंत्रक के रूप में सेट करता हूं। यह मूल रूप से नियंत्रक 1 से छुटकारा दिलाता है और हमारी खिड़की अब केवल अपने पदानुक्रम में नियंत्रक 2 है। अब, आप कंट्रोलर 2. पर कॉल करके वर्तमान में नियंत्रक 3 को सामान्य रूप से पेश कर सकते हैं।
सेंट्रमग्यु

यकीन है, कि मेरे लिए काम करता है, लेकिन अलग-अलग समस्याओं की एक किस्म का कारण बनता है जैसे स्टेटस बार या एनीमेशन कटिंग सेगमेंट के दौरान, मुझे नहीं लगता कि यह सुरक्षित है। इसका एक बेहतर समाधान होना चाहिए ...
पावेल ज़गोडा-फ़र्च्मिन

ये समस्याएं कब होती हैं? जब आप वर्तमान को बुलाते हैं () या जब आप रूट व्यू कंट्रोलर सेट करते हैं? गायब होने का स्टेटस बार हो सकता है क्योंकि स्टेटस बार ब्लैक टेक्स्ट में होता है और एक ब्लैक बैकग्राउंड पर दिखाई देता है जब वर्तमान () में एप्लिकेशन के बैकग्राउंड के साथ ब्लेंड होने का कारण बनता है।
सेंट्रमग्युय

1
मैंने एक साधारण डेमो प्रोजेक्ट बनाया। आप यहाँ पर देख सकते हैं: GitHub । सभी तर्क कंट्रोलर 1. स्विफ्ट में हैं। मुझे बताएं क्या इससे मदद मिलती है!
सेंट्रमग्यु

1

मुझे लगता है कि vc.modalPresentationStyle = .fullScreenअगर UINavigationController नहीं है, तो समस्या का समाधान करके हल किया जा सकता है, अन्यथा आप इन कोडों का उपयोग इस प्रकार कर सकते हैं:

let navigationController = UINavigationController(rootViewController: vc) 
navigationController.modalPresentationStyle = .fullScreen 
present(vc, animated: true)

क्योंकि iOS 13 के साथ यह एक नया फीचर है कि Apple ने पूर्ण 12 से iOS के लिए व्यू कंट्रोलर्स की डिफ़ॉल्ट प्रस्तुति शैली को एक मोडल शीट में बदल दिया है


2
.fullScreen यह पुराने iOS 12 प्रस्तुति की तरह दिखता है जहाँ आप इसके पीछे नियंत्रक को नहीं देख सकते हैं। वह नहीं है जो मैं जा रहा हूँ।
CentrumGuy

@ सेंट्रमग्राम, आप लिंक को देख सकते हैं " medium.com/better-programming/… ", इसे विवरण में समझाया गया था।
Apple ने डिफॉल्ट

1
मुझे पता है कि Apple ने iOS 13 में डिफॉल्ट प्रेजेंटेशन स्टाइल को बदल दिया है। हालांकि, जब मैं अपने व्यू कंट्रोलर को अपने ऐप में पेश करता हूं तो प्रेजेंट कंट्रोलर हिलता नहीं है जैसा कि आईओएस 13. पर हर जगह होता है। आप पहले और दूसरे के बीच अंतर देख सकते हैं। वर्तमान व्यू कंट्रोलर के चित्रों को सबसे ऊपरी व्यू कंट्रोलर के पीछे प्रदर्शित किया जाता है। मैं पहली तस्वीर
CentrumGuy

मैं खुश हूं कि मैं मदद कर सका!
glotcha

1

प्रोग्राम के रूप में:

let vc = UIViewController()
vc.modalPresentationStyle = .fullScreen //or .overFullScreen for transparency
self.present(vc, animated: true, completion: nil)

स्टोरीबोर्ड से:

यहां छवि विवरण दर्ज करें

बस। रूट नियंत्रक या विंडो के साथ खेलने की कोई आवश्यकता नहीं है।

संदर्भ के लिए, इस लेख पर जाएँ ।


0

हम इसे इंस्पेक्टर टूल बार में बदल सकते हैं। इसे प्राप्त करने के लिए: इंस्पेक्टर टोलबार के पांचवें खंड पर जाएं और फिर प्रस्तुति क्षेत्र को पूर्ण स्क्रीन पर बदलें।


-1

यह केवल वही संपत्ति होनी चाहिए जिसकी आपको आवश्यकता है

presentedViewController.modalPresentationStyle = .automatic

Https://developer.apple.com/videos/play/wwdc2019/224/ पर विस्तृत


इसे स्वचालित पर सेट करना इस समस्या को ठीक करने के लिए प्रकट नहीं होता है
CentrumGuy

अग्रभूमि दृश्य नियंत्रक के पीछे दृश्य नियंत्रक वह है जिसे मैं "वर्तमान" कहता हूं। (एक आप नियंत्रक के पीछे देख सकते हैं)
CentrumGuy

क्या यह जड़ है? आप
window.rootViewController
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.