2012-04-13 13 views
6

मेरे पास एक UIViewController है जिसमें अन्य व्यू कंट्रोलर हैं। प्रारंभिक ViewController viewDidLoad में स्थापित किया जाएगा:कंटेनर व्यू कंट्रोलर में UIPageViewController का घूर्णन

FirstViewController *first = [FirstViewController alloc] init]; 
first.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 
first.view.frame = m_content.frame; 

[self addChildViewController:first]; 
[m_content.view addSubview:first.view]; 
[first didMoveToParentViewController:self]; 
m_activeViewController = first; 

यह कंटेनर नियंत्रक automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers लागू किया गया है हाँ वापस जाने के लिए। यह भी गैर सक्रिय ViewControllers

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return YES; 
} 
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
{ 
    for(UIViewController *vc in m_viewControllers) 
    { 
     if(vc != [m_activeViewController] 
      [vc willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; 
    } 
} 
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 
{ 
    for(UIViewController *vc in m_viewControllers) 
    { 
     if(vc != [m_activeViewController] 
      [vc didRotateFromInterfaceOrientation:fromInterfaceOrientation]; 
    } 
} 

जब मेनू बटन उपयोग किया है मैं ViewControllers के बीच संक्रमण बनाने के लिए आगे रोटेशन परिवर्तन manualy को लागू किया है।

- (void)onMenuItemTapped:(id)sender 
{ 
    UIViewController *vc = [m_viewControllers objectAtIndex:sender.tag]; 

    vc.view.frame = m_content.frame; 
    [self addChildViewController:vc]; 
    [self transitionFromViewController:m_activeViewController toViewController:vc duration:0 options:UIViewAnimationOptionTransitionNone animations:nil completion:^(BOOL finished) { 
    [vc didMoveToParentViewController:self]; 
    [m_activeViewController removeFromParentViewController]; 
    m_activeViewController = vc; 
    }]; 
} 

इस संक्रमण मेरी "सामान्य" ViewControllers के लिए ठीक काम करता है और वे उन्मुखीकरण परिवर्तन के बाद ठीक से प्रदर्शित कर रहे हैं, भले ही वे सक्रिय नहीं हैं। हालांकि, इनमें से एक चाइल्ड व्यू कंट्रोलर, जिसे सेकेंडसीवी कहा जाता है, में UIPageViewController एक बाल व्यू कंट्रोलर के रूप में है। मैं UIPageViewControllerDelegate और UIPageViewControllerDataSource इस SecondCV लिए सेट है और pageViewController में: spineLocationForInterfaceOrientation: मैं पोर्ट्रेट और लैंडस्केप UIPageViewControllerSpineLocationMid के लिए के लिए UIPageViewControllerSpineLocationMin लौट आते हैं। इस सेकेंडवीसी के लिए रोटेशन सही होने पर सही तरीके से काम करता है - लैंडस्केप पर दो पेज हैं और पोर्ट्रेट मोड पर एक सही तरीके से प्रदर्शित होता है। लेकिन जब यह सेकेंडवीसी सक्रिय नहीं है तो घूर्णन गलत है। भले ही पृष्ठ दृश्य नियंत्रक: spineLocationForInterfaceOrientation: कहा जाता है, पोर्ट्रेट और लैंडस्केप मोड दोनों में अभी भी एक पृष्ठ है। मैं इसे कुछ समय के लिए ठीक करने की कोशिश कर रहा हूं, लेकिन मुझे कोई अन्य विकल्प नहीं दिख रहा है। क्या आपके पास कोई विचार है कि इसे कैसे ठीक किया जाए?

धन्यवाद।

उत्तर

1

मैंने इस तरह की मुश्किल हल की है।

दरअसल द्वितीय श्रेणी सही ढंग से घुमाया गया था, या कम से कम, रीढ़ की हड्डी का स्थान सही ढंग से बदला गया था। इसलिए जब मैंने डिवाइस को घुमाया है और दूसरा वीवीसी मूल दृश्य में सक्रिय दृश्य नियंत्रक नहीं था, तो है को रोटेशन संदेश और पृष्ठ प्राप्त हुआ नियंत्रक: spineLocationForInterfaceOrientation: भी कहा जाता था। मैंने नए इंटरफ़ेस अभिविन्यास के लिए सही रीढ़ स्थान सेट किया है और setViewControllers को सेकेंडविच के पृष्ठ दृश्य नियंत्रक के लिए बुलाया है। समस्या यह थी कि अगर मैं UIPageViewControllerSpineLocationMid के लिए दो दृश्य नियंत्रक सेट करता हूं, तो दूसरा आईवीवीवी प्रदर्शित करने के बाद भी यूआईपीएज व्यू कंट्रोलरस्पिनलोकेशनमिन में बस एक था।

मैं समस्या "तय" कर दिया है, viewWillAppear में पृष्ठ दृश्य नियंत्रक करने के लिए दृश्य नियंत्रकों की स्थापना द्वारा: फिर, क्योंकि जब इस विधि कहा जाता है, पृष्ठ दृश्य नियंत्रक के लिए रीढ़ की हड्डी स्थान सही है और इस जानकारी को मैं एक सेट के आधार पर , या दो पृष्ठों (देखें नियंत्रक)

- (void)viewWillAppear:(BOOL)animated 
{ 
if(m_pageController.spineLocation == UIPageViewControllerSpineLocationMid) 
{ 
    LeftPageController *left; 
    RightPageController *right; 
    if(m_pageController.viewControllers.count > 0) 
    { 
     left = [m_pageController.viewControllers objectAtIndex:0]; 

     right = [m_storyboard instantiateViewControllerWithIdentifier:@"rightPage"]; 
     [right loadView]; 
    } 

    [m_pageController setViewControllers:[NSArray arrayWithObjects:left, right, nil] direction:UIPageViewControllerNavigationDirectionForward | UIPageViewControllerNavigationDirectionReverse animated:NO completion:nil]; 

    [m_left hideGallery]; 
} 

if(m_pageController.spineLocation == UIPageViewControllerSpineLocationMin) 
{ 

    [m_pageController setViewControllers:[NSArray arrayWithObject:[m_pageController.viewControllers objectAtIndex:0]] direction:UIPageViewControllerNavigationDirectionForward | UIPageViewControllerNavigationDirectionReverse animated:NO completion:nil]; 
} 

[super viewWillAppear:animated]; 
} 


- (UIPageViewControllerSpineLocation)pageViewController:(UIPageViewController *)pageViewController spineLocationForInterfaceOrientation:(UIInterfaceOrientation)orientation 
{ 
if(UIInterfaceOrientationIsPortrait(orientation)) 
{ 
    LeftPageController *left = [pageViewController.viewControllers objectAtIndex:0]; 
    [pageViewController setViewControllers:[NSArray arrayWithObject:left] direction:UIPageViewControllerNavigationDirectionForward | UIPageViewControllerNavigationDirectionReverse animated:NO completion:nil]; 

    pageViewController.doubleSided = NO;  

    return UIPageViewControllerSpineLocationMin; 
} 

if(UIInterfaceOrientationIsLandscape(orientation)) 
{  
    LeftPageController *left; 
    RightPageController *right; 
    if(pageViewController.viewControllers.count > 0) 
    { 
     left = [pageViewController.viewControllers objectAtIndex:0]; 
     right = [m_storyboard instantiateViewControllerWithIdentifier:@"rightPage"]; 
     [right loadView]; 
    } 

    [pageViewController setViewControllers:[NSArray arrayWithObjects:left,right, nil] direction:UIPageViewControllerNavigationDirectionForward | UIPageViewControllerNavigationDirectionReverse animated:NO completion:nil]; 

    return UIPageViewControllerSpineLocationMid; 
} 

return UIPageViewControllerSpineLocationMin; 
} 

मैं जानता हूँ कि मैं दो बार एक ही बात कर रहा हूँ, लेकिन कीमत मैं इस मामले में भुगतान करने के लिए तैयार हूँ thats। क्यों pageViewController बुला के बाद: spineLocationForInterfaceOrientation: और लैंडस्केप के लिए दो दृश्य नियंत्रकों की स्थापना, जब SecondVC निष्क्रिय है, तो viewWillAppear में m_pageController में केवल एक ViewController है: सक्रिय करने के बाद SecondVC मेरे लिए एक रहस्य बना रहता है।

+0

मैं पेज व्यू कंट्रोलर का भी उपयोग कर रहा हूं, और मैंने वीसी को एक सरणी में जोड़ा है, लेकिन विभिन्न वीसी के संक्रमण के उचित तरीके को नहीं जानते हैं, मैं पेज कर्ल संक्रमण का उपयोग करके अगले वीसी के लिए कैसे जा सकता हूं। क्या आप कृपया इसके लिए मुझे मार्गदर्शन कर सकते हैं या इसके कुछ नमूना कोड पोस्ट कर सकते हैं। –

+0

[लिंक] (https://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomContainerViewControllers/CreatingCustomContainerViewControllers.html) मुझे लगता है कि आप यहां सबकुछ पा सकते हैं, अगर नहीं, तो मुझसे संपर्क करें – DaNY

+0

मुझे कोई नहीं मिला है समाधान अभी तक, अगर आप मुझे मार्गदर्शन कर सकते हैं तो कृपया मेरे प्रश्न पर एक नज़र डालें। "Http://stackoverflow.com/questions/13776894/uipageviewcontroller-change-from-two-page-mode-to-one-page-mode-without-changi#comment18942540_13776894" –

0

मैं iOS 6 में इस समस्या को हल करने के लिए कोड निम्न शामिल:

- (UIPageViewControllerSpineLocation)pageViewController:(UIPageViewController *)pageViewController spineLocationForInterfaceOrientation:(UIInterfaceOrientation)orientation 
{ 

    NSArray *allPageControllers = pageViewController.viewControllers 

    if (allPageControllers != nil) { 
     [self setViewControllers:allPageControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil]; 
    } 

    else { 

     UIViewController *defaultViewController = [[UIViewController alloc] init]; 
     [self setViewControllers:[NSArray arrayWithObject:defaultViewController] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil]; 
     [defaultViewController release]; 
    } 

    return UIPageViewControllerSpineLocationMin; 
} 

आशा है कि यह किसी को मदद करता है!

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