2012-07-03 8 views
5

Ich habe den PageControl-Beispielcode von Apple heruntergeladen. Es ist ein Projekt mit UIPageControl. Ich habe es geändert, so dass die UIScrollView verschiedene Ansichten hat. Für jede Ansicht, die ich hinzufügen möchte, habe ich eine UINavigationController mit einer rootViewController als Unterklasse von entweder UIViewController oder UITableViewController erstellt. Dann fügte ich in die UIScrollView die Ansicht der navigationController hinzu.Warum wird der übergeordnete Rahmen nach disadowViewControllerAnimated nicht die gleiche Größe beibehalten?

Sagen wir, ich bin jetzt auf den ersten Blick. Ich möchte einen Modal View Controller zeigen. Wenn ich es ablehne, ist der Eltern-View-Controller (HomeViewController in meinem Beispiel) im Vollbildmodus, anstatt die Größe, die es zuvor war, die die Seitensteuerung am unteren Rand zeigen würde. Der einzige Weg, wie ich es richtig machen kann, ist die Größe des Frames nach der Kündigung, aber das ist eine schlechte Benutzererfahrung, weil es aufgerufen wird, nachdem der Eltern-View-Controller angezeigt wird. Haben Sie Ideen, wie Sie vermeiden können, dass der Rahmen HomeViewController geändert wird, wenn Sie einen Modal-View-Controller ablehnen?

-(void)dismissMVC:(id)sender { 
    CGRect frame = self.view.frame; 
    [self dismissViewControllerAnimated:YES completion:^{ 
     self.view.frame = frame; 
    }];  
} 


- (void)loadScrollViewWithPage:(int)page 
{ 
if (page < 0) 
    return; 
if (page >= kNumberOfPages) 
    return; 

// replace the placeholder if necessary 
switch (page) { 
    case Home: 
    { 
     HomeViewController *controller = [viewControllers objectAtIndex:page]; 

     if ((NSNull *)controller == [NSNull null]) 
     { 
      controller = [[HomeViewController alloc] initWithPageNumber:page]; 
      [viewControllers replaceObjectAtIndex:page withObject:controller]; 
      [controller release]; 
     } 

     // add the controller's view to the scroll view 
     if (controller.view.superview == nil) 
     { 
      UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller]; 
      navController.navigationBar.barStyle = UIBarStyleBlack; 
      [navController setNavigationBarHidden:YES]; 
      CGRect frame = scrollView.frame; 
      frame.origin.x = frame.size.width * page; 
      frame.origin.y = 20; 
      frame.size.height = frame.size.height - 20; 
      navController.view.frame = frame; 
      controller.view.frame = frame; 
      [controller setNavController:navController]; 

      [scrollView addSubview:navController.view]; 
      [navController release]; 
     } 
     break; 
    } 
} 
} 
+0

Haben Sie jemals herausgefunden, warum das so ist? – aloo

+0

@aloo Es ist jetzt fast ein Jahr her, also kann ich mich nicht erinnern, wie ich das repariert habe. Haben Sie das gleiche Problem? – Adriana

+0

ja erlebt es, aber ich kann es nicht reproduzieren in einem kleinen Testprojekt – aloo

Antwort

2

Wenn veiwControllers auf einen Navigationsstapel schieben, Viewcontrollers, der Blick ist nicht der Strom kann man wegen der geringen Speicher freigegeben werden, gezeigt wird.

Wenn Sie eine Instanz von HomeViewController entweder im AppDelegate oder in der ViewController-Instanz, die Sie ursprünglich drückten, pflegen, können Sie HomeViewController.view aufrufen, um das Laden der Ansicht zu erzwingen, und dann vor dem Aufruf von displaceViewControllerAnimated den gewünschten Frame angeben.

0

Wenn Sie die Ansicht eines Viewcontrollers als Unteransicht hinzufügen, müssen Sie sie auch als childViewController hinzufügen.

In Ihrem Code:

[Scroll addSubview: navController.view]; Die Zeile fehlt: [scrollView addChildViewController: navController];