16

पर आधारित है, मैं अपने दृश्य नियंत्रकों के लिए UIPresentationController आधारित प्रस्तुतियों पर आगे बढ़ रहा हूं लेकिन एपीआई के साथ कुछ भ्रम में भाग गया हूं।अनुकूली UIPresentationController दृश्य आकार

मेरे पास एक कस्टम साइडबार शैली दृश्य नियंत्रक प्रस्तुति है (LookInside डब्ल्यूडब्ल्यूडीसी 2014 डेमो कोड के समान)।

इस वर्ग क्लस्टर (UIPresentationController, UIViewControllerTransitioningDelegate, और UIViewControllerAnimatedTransitioning) नियमित आकार वर्ग विचारों पर स्क्रीन के किनारे से एक साइडबार के रूप में एक दृश्य नियंत्रक प्रस्तुत करता है, और कॉम्पैक्ट आकार वर्ग विचारों पर पूर्ण स्क्रीन के रूप में एक ही दृश्य नियंत्रक प्रस्तुत करता है।

आकार बदलने योग्य आईपैड लक्ष्य पर इसका परीक्षण सही व्यवहार दिखाता है: मैंने क्षैतिज आकार वर्ग को "कॉम्पैक्ट" पर सेट किया है और मेरा व्यू कंट्रोलर साइडबार से पूर्ण स्क्रीन तक स्विच करता है।

हालांकि, मुझे और अधिक ग्रैन्युलरिटी चाहिए। मैं आईफोन 6 और 6+ पर साइडबार-शैली दृश्य नियंत्रक प्रस्तुति का उपयोग करना चाहता हूं, जब डिवाइस लैंडस्केप ओरिएंटेशन में है, और पोर्ट्रेट अभिविन्यास में सभी iPhones के लिए पूर्ण-स्क्रीन शैली प्रस्तुति का उपयोग करना चाहता हूं।

//If my sidebar is going to occupy more than half the new width of the view... 
if(self.sidebarTransitionController.width > size.width/2.0) 
{ 
    //Override the presentation controller's trait collection with Compact horizontal size class 
    sidebarPresentationController.overrideTraitCollection = [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassCompact]; 
} 
else 
{ 
    //Otherwise override the trait collection with Regular 
    sidebarPresentationController.overrideTraitCollection = [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassRegular]; 

} 

हालांकि इस करता है:

मेरी विधि

- (void) viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator 

में

तो मैं पता लगाने के लिए कि क्या साइडबार स्क्रीन के बहुत ज्यादा घेरता है, मान लीजिए कि मैं निम्नलिखित शर्त का उपयोग करते हैं कुछ तर्क लागू किया कुछ भी तो नहीं। के लिए प्रलेखन:

इस संपत्ति का उपयोग किसी भी विशेषता को निर्दिष्ट करने के लिए करें जिसे आप प्रस्तुत और प्रस्तुत करने वाले दृश्य नियंत्रकों पर लागू करना चाहते हैं। आपके द्वारा निर्दिष्ट लक्षण वर्तमान में प्रभाव नियंत्रकों के लिए लागू किसी भी मौजूदा गुण को ओवरराइड करते हैं। इस संपत्ति का डिफ़ॉल्ट मूल्य शून्य है।

इस संपत्ति के लिए एक नया मूल्य असाइन करने से प्रेजेंटेशन नियंत्रक को लक्षणों के नए सेट में संक्रमण करने का कारण बनता है, जिसके परिणामस्वरूप प्रस्तुत इंटरफ़ेस में एनिमेशन हो सकता है।

प्रस्तुति नियंत्रक के लिए नया मान असाइन करने से मेरा प्रस्तुत इंटरफ़ेस किसी भी तरह से परिवर्तित नहीं होता है। (भले ही मैं overrideTraitCollection असाइन करता हूं, UIPresentationControllerUIViewControllerTransitioningDelegate ऑब्जेक्ट के भीतर से बनाया गया है।)

मुझे क्या याद आ रही है? क्या एक और दानेदार स्तर पर UIPresentationController के साथ अनुकूली प्रस्तुति निष्पादित करना संभव है?

उत्तर

1

क्या अधिक व्याकरण स्तर पर UIPresentationController के साथ अनुकूली प्रस्तुति निष्पादित करना संभव है?

आसानी से नहीं।

मैं इनमें से एक विकल्प का सुझाव:

  1. नियंत्रण पर दें और UIKit के सीमित adaptivity स्वीकार करते हैं: आप एक पूर्ण स्क्रीन प्रस्तुति के लिए बदलने के लिए या एक खास विशेषता के संग्रह के लिए एक अलग दृष्टिकोण नियंत्रक पेश कर सकते हैं। अपने ऐप को तेज़ी से शिप करने के लिए इसके साथ जाएं।

  2. प्रस्तुतियों का उपयोग करें लेकिन UIKit के खिलाफ काम करें। एक तरीका viewWillTransitionToSize:withTransitionCoordinator: को ओवरराइड करना है और प्रस्तुत किए गए दृश्य नियंत्रक को फिर से प्रस्तुत करना है, जिससे आप कोई भी परिवर्तन कर सकते हैं जैसे कि एक अलग प्रस्तुति शैली या प्रस्तुति नियंत्रक प्रदान करना। यह बहुत अधिक समय के बिना ठीक परिणाम दे सकता है।

  3. दृश्य नियंत्रक रोकथाम का उपयोग करें। UIKit सर्वोत्तम प्रथाओं के साथ चिपके रहते हुए यह निम्नतम स्तर के बारे में है। आपका मुख्य दृश्य नियंत्रक कंटेनर व्यू कंट्रोलर का बच्चा बन जाता है, और प्रस्तुत करने के बजाय आप कंटेनर को अन्य व्यू कंट्रोलर दिखाने के लिए कहते हैं। यदि ऐप कस्टम और उत्तम होना चाहिए, तो इसके साथ जाएं, और आप इसे सही बनाने के लिए समय व्यतीत कर सकते हैं।

1

उपयोग:

- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller 
                   traitCollection:(UITraitCollection *)traitCollection NS_AVAILABLE_IOS(8_3); 

यह रोटेशन भले ही आकार वर्ग नहीं बदला है पर कहा जाता है, ताकि आप मुहावरा/अभिविन्यास विशिष्ट अनुकूलन करने के लिए एक अच्छी जगह है। याद रखें कि आईफोन 6 ज़ूम इन मोड में चला सकता है।

0

मैं एक ही मुद्दे पर चल रहा था। आकार वर्गों से डिवाइस अभिविन्यास की व्याख्या करना संभव है, हालांकि पूरी तरह से अनजाने में नहीं, लेकिन निम्नलिखित मेरे उद्देश्यों के लिए काम किया।

Programming iOS 9: Dive Deep into Views, View Controllers and Frameworks से

, इस तरह महत्वपूर्ण जानकारी से भरा एक उत्कृष्ट पुस्तक:

horizontalSizeClass, verticalSizeClass

एक UIUserInterfaceSizeClass मूल्य, या तो .Regular या .Compact। इन्हें आकार वर्ग कहा जाता है। संयोजन में आकार कक्षाएं,, है निम्नलिखित अर्थ:

दोनों ऊर्ध्वाधर और क्षैतिज आकार वर्गों .Regular कर रहे हैं: हम एक iPad

लंबवत आकार वर्ग .Regular है पर चल रहे हैं, लेकिन क्षैतिज आकार वर्ग .Compact है: हम पोर्ट्रेट अभिविन्यास में ऐप के साथ एक आईफोन पर चल रहे हैं। (वैकल्पिक रूप से हम एक आईपैड पर एक स्प्लिटस्क्रीन आईपैड मल्टीटास्किंग कॉन्फ़िगरेशन में चल रहे हैं; अध्याय 9 देखें)।

दोनों ऊर्ध्वाधर और क्षैतिज आकार वर्ग .Compact हैं: हम परिदृश्य अभिविन्यास में ऐप के साथ एक आईफोन (आईफोन 6 प्लस को छोड़कर) पर चल रहे हैं।

लंबवत आकार वर्ग .Compact है और क्षैतिज आकार वर्ग .Regular है: हम परिदृश्य अभिविन्यास में एक आईफोन 6 प्लस पर चल रहे हैं।

उदा। व्यू कंट्रोलर में:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "ShowComposeView" { 
     segue.destinationViewController.presentationController!.delegate = self 
     segue.destinationViewController.modalPresentationStyle = .PageSheet 
    } 
} 

func adaptivePresentationStyleForPresentationController(controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle { 
    // If we do an adaptive presentation, and adapt from Page Sheet to Form Sheet, 
    // then on iPhone 6 we will get the nice rounded corners of the nav bar 
    // in both portrait and landscape. (From pg. 298 of Programming iOS 9) 

    // We want this behaviour on iPhone in Portrait orientation only. 
    if traitCollection.horizontalSizeClass == .Compact && traitCollection.verticalSizeClass == .Regular { 
     return .FormSheet 
    } 
    else { 
     return .PageSheet 
    } 
} 
संबंधित मुद्दे