2015-08-28 5 views
7

मेरे ऐप में, कुछ दृश्य नियंत्रक हैं जहां आईपैड (या अधिक विशिष्ट, एक नियमित क्षैतिज आकार वर्ग होने के लिए) उन्हें पॉपओवर के रूप में पेश करने के लिए समझ में आता है, लेकिन आईफोन (या कॉम्पैक्ट क्षैतिज आकार वर्ग) पर यह समझ में आता है नेविगेशन स्टैक पर उन्हें धक्का देने के लिए। क्या इसका समर्थन करने का एक शानदार तरीका है? डिफ़ॉल्ट रूप से, अगर मैं "पॉपओवर के रूप में प्रस्तुत करें" सेग्यू का उपयोग करता हूं, तो यह आईफोन पर सामान्य रूप से प्रदर्शित होगा, जो मैं नहीं चाहता हूं।मैं एक सेगू कैसे बना सकता हूं जो आईपैड पर पॉपओवर का उपयोग करेगा, और आईफोन पर नेविगेशन स्टैक पर धक्का देगी?

मुझे जिस व्यवहार को मैं चाहता हूं उसे पाने का एक तरीका मिला है, लेकिन यह बदसूरत है और त्रुटि-प्रवण लगता है। मैं वर्तमान में किस आकार वर्ग के आधार पर दो अलग-अलग सीगों के बीच चयन करता हूं। आईओएस 9 मल्टीटास्किंग का समर्थन करने के लिए, मैं [UIViewController willTransitionToTraitCollection:withTransitionCoordinator] लागू करता हूं और मैन्युअल रूप से पॉप नियंत्रक और नेविगेशन नियंत्रक के बीच दृश्य नियंत्रक को स्थानांतरित करता हूं (यह हिस्सा विशेष रूप से त्रुटि-प्रवण लगता है) ।

ऐसा लगता है कि इसे संभालने के लिए या तो कस्टम सेग्यू को लागू करने के लिए कुछ आसान तरीका होना चाहिए, या कुछ प्रकार के कस्टम अनुकूली प्रस्तुति नियंत्रक, लेकिन मैं इसके चारों ओर अपने सिर को लपेटने में सक्षम नहीं हूं। क्या किसी ने सफलता हासिल की है?

+1

आप आप क्या हासिल करने की कोशिश कर रहे थे के लिए एक बेहतर समाधान मिला? –

+0

मैंने किया, लेकिन यह सही नहीं है। इसे एक उत्तर के रूप में जोड़ा गया है, अगर आप कुछ बेहतर समझते हैं तो सुनना अच्छा लगेगा। –

उत्तर

1

मुझे इस के अनुसार, सबसे आसान तरीका है

चरण 1: एक और करने के लिए अपने एक नियंत्रक से दो segues बनाएँ।
चरण 2: एक segue के segue प्रॉपर्टी सेट धक्का और एक अन्य
चरण 3 की पॉपओवर रहे हैं: अब segue प्रदर्शन फोन अपनी आवश्यकताओं, ieiPad या iPhone

यहाँ के अनुसार a sample code

है नमूना कोड नोट: didSelectRowAtIndexPath में किसी अन्य स्थिति की जांच करने के लिए बूल स्थिति को गलत में बदलें।

+0

हाँ, यही वह है जो मैं अब कर रहा हूं।लेकिन आईओएस 9 मल्टीटास्किंग को लागू करने की कोशिश करते समय यह विशेष रूप से गन्दा हो जाता है। मैं एक और अधिक सुरुचिपूर्ण दृष्टिकोण खोजने की उम्मीद कर रहा हूँ। –

+0

ठीक है, यह दृष्टिकोण है जिसे मैंने सोचा था। –

1

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

PushPopoverSegue.swift

import UIKit 

class PushPopoverSegue: UIStoryboardSegue { 

    var sourceBarButtonItem: UIBarButtonItem! 
    var permittedArrowDirections: UIPopoverArrowDirection = .Any 

    override func perform() { 
     assert(self.sourceViewController.navigationController != nil) 
     assert(self.sourceBarButtonItem != nil) 

     if self.sourceViewController.traitCollection.horizontalSizeClass == .Compact { 
      self.sourceViewController.navigationController!.pushViewController(self.destinationViewController, animated: true) 
     } 
     else { 
      let navigationController = UINavigationController(rootViewController: self.destinationViewController) 
      let popover = UIPopoverController(contentViewController: navigationController) 
      popover.presentPopoverFromBarButtonItem(self.sourceBarButtonItem, permittedArrowDirections: self.permittedArrowDirections, animated: true) 
     } 
    } 

} 

UIViewController + PushPopoverTransition.h

#import <UIKit/UIKit.h> 

@interface UIViewController (PushPopoverTransition) 

- (void) transitionPushPopoversToHorizontalSizeClass: (UIUserInterfaceSizeClass) sizeClass withMapping: (NSDictionary*) mapping; 

@end 

UIViewController + PushPopoverTransition.m

#import "UIViewController+PushPopoverTransition.h" 

@implementation UIViewController (PushPopoverTransition) 

- (void) transitionPushPopoversToHorizontalSizeClass: (UIUserInterfaceSizeClass) sizeClass withMapping: (NSDictionary*) mapping 
{ 
    if (sizeClass == UIUserInterfaceSizeClassCompact) 
    { 
     if (self.presentedViewController == nil) 
      return; 

     NSParameterAssert([self.presentedViewController isKindOfClass:[UINavigationController class]]); 
     UINavigationController* navigationController = (UINavigationController*) self.presentedViewController; 
     NSArray* viewControllers = navigationController.viewControllers; 
     UIViewController* topOfStack = viewControllers[0]; 

     if ([mapping.allKeys containsObject:NSStringFromClass([topOfStack class]) ]) 
     { 
      [self.presentedViewController dismissViewControllerAnimated:NO completion:^{ 
       for (UIViewController* viewController in viewControllers) 
        [self.navigationController pushViewController:viewController animated:NO]; 
      }]; 
     } 
    } 
    else if (sizeClass == UIUserInterfaceSizeClassRegular) 
    { 
     NSUInteger indexOfSelf = [self.navigationController.viewControllers indexOfObject:self]; 

     if (indexOfSelf < self.navigationController.viewControllers.count - 1) 
     { 
      UIViewController* topOfStack = self.navigationController.viewControllers[indexOfSelf + 1]; 
      if ([mapping.allKeys containsObject:NSStringFromClass([topOfStack class])]) 
      { 
       NSArray* poppedControllers = [self.navigationController popToViewController:self animated:NO]; 
       UINavigationController* navigationController = [[UINavigationController alloc] init]; 
       navigationController.modalPresentationStyle = UIModalPresentationPopover; 
       navigationController.viewControllers = poppedControllers; 

       id popoverSource = mapping[NSStringFromClass([topOfStack class])]; 
       if ([popoverSource isKindOfClass:[UIBarButtonItem class]]) 
       { 
        navigationController.popoverPresentationController.barButtonItem = popoverSource; 
       } 
       else if ([popoverSource isKindOfClass:[NSArray class]]) 
       { 
        NSArray* popoverSourceArray = (NSArray*) popoverSource; 
        NSParameterAssert(popoverSourceArray.count == 2); 
        UIView* sourceView = popoverSourceArray[0]; 
        CGRect sourceRect = [(NSValue*) popoverSourceArray[1] CGRectValue]; 
        navigationController.popoverPresentationController.sourceView = sourceView; 
        navigationController.popoverPresentationController.sourceRect = sourceRect; 
       } 

       [self presentViewController:navigationController animated:NO completion:nil]; 
      } 
     } 
    } 
} 

@end 

उदाहरण प्रयोग

इंटरफ़ेस बिल्डर में एक सेग्यू बनाएं, और कस्टम पर "दयालु" सेट करें, और इसकी "कक्षा" PushPopoverSegue पर सेट करें।

ViewController.m

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    ((PushPopoverSegue*) segue).sourceView = /* source view */; 
    ((PushPopoverSegue*) segue).sourceRect = /* source rect */; 
} 

-(void) willTransitionToTraitCollection:(UITraitCollection *)newCollection withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator 
{ 
    if (newCollection.horizontalSizeClass == UIUserInterfaceSizeClassUnspecified) 
     return; 

    [self transitionPushPopoversToHorizontalSizeClass:newCollection.horizontalSizeClass withMapping:@{ 
     @"MyDestinationViewController": @[ /* source view */, 
             [NSValue valueWithCGRect:/* source rect*/] ] 
    }]; 
} 
+0

क्या आपको कुछ बेहतर मिला है या क्या आप अभी भी इस समाधान का उपयोग कर रहे हैं? – SAHM

+1

अभी भी इसका उपयोग कर रहा है। यह अभी भी मेरे लिए काम कर रहा है, इसलिए मेरे पास वापस जाने का अधिक कारण नहीं है। –

+0

धन्यवाद। मुझे इसे एक मौका और देना होगा। क्या आप जानते थे कि यूआईपीओवर कंट्रोलर को आईओएस 9 में बहिष्कृत किया गया था? – SAHM

संबंधित मुद्दे

 संबंधित मुद्दे