2009-09-30 8 views
7

Chciałbym utworzyć podklasę UIViewController wielokrotnego użytku, która może być pokazana jako kontroler widoku modalnego nad dowolnym innym kontrolerem widoku. Jedną z pierwszych rzeczy, które musi wykonać VC wielokrotnego użytku, jest wyskakujące okno UIActionSheet. Aby to zrobić, tworzę domyślny (pusty) widok w moim VC, aby pokazać arkusz akcji z.Jak utworzyć przezroczysty modalny kontroler UIViewController?

To jednak wygląda źle, ponieważ po wyświetleniu modalnego vc rodzic vc jest ukryty. Wygląda więc na to, że arkusz akcji unosi się nad pustym tłem. Byłoby lepiej, gdyby arkusz akcji mógł wyglądać tak, jakby pojawiał się nad oryginalnym (rodzicielskim) vc.

Czy istnieje sposób, aby to osiągnąć? Czy bezpieczne jest po prostu pobranie widoku rodzica vc i animacja arkusza UIActionSheet?

+0

ten sam problem. . Jakieś rozwiązanie? – Frade

Odpowiedz

0

Możesz po prostu pokazać go nad rodzicielskim kontrolerem widoku, wstawiając widok do widoku nadrzędnego.

coś takiego:

PseudoModalVC *vc = ...//initialization 
vc.view.backgroundColor = [UIColor clearColor]; // like in previous comment, although you can do this in Interface Builder 
vc.view.center = CGPointMake(160, -vc.view.bounds.size.height/2); 
[parentVC.view addSubView:vc.view]; 

// animation for pop up from screen bottom 
[UIView beginAnimation:nil context:nil]; 
vc.view.center = CGPointMake(160, vc.view.bounds.size.height/2); 
[UIView commitAnimation]; 
+1

Jeśli to zrobisz, będziesz także musiał wykonać wszystkie odpowiednie wywołania metod takich jak "viewWillAppear" w wyświetlanym kontrolerze widoku. UINavigationController i system modalny dbają o to w normalny sposób. – DougW

-1

Tak. Dodaj go do widoku bieżącego kontrolera widoku (lub jako podglądu okna) i animuj go na ekranie, tak jak powiedział Valerii.

Aby usunąć go z animacją, to zrobić (jestem zakładając widok modalne wynosi 320 x 460 i będzie przesuwać się w dół z ekranu):

- (void)dismissModal 
{ 
    // animate off-screen 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut]; 
    [UIView setAnimationDuration:0.50]; 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)]; 

    self.view.frame = CGRectMake(0, 480, 320, 460); 

    [UIView commitAnimations]; 
} 

- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context 
{ 
    // don't remove until animation is complete. otherwise, the view will simply disappear 
    [self.view removeFromSuperview]; 
} 
14

Po Twój modalne widok ożywia się, to jest zmieniany tak, aby był równy rozmiarowi względem jego widoku macierzystego. Co można zrobić, to wewnątrz viewDidAppear :, sfotografować zdaniem parentController, a następnie wstawić UIImageView zawierający obraz rodzica z tyłu liście Twojego własny pogląd dnia subviews:

#pragma mark - 
#pragma mark Sneaky Background Image 
- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 

    // grab an image of our parent view 
    UIView *parentView = self.parentViewController.view; 

    // For iOS 5 you need to use presentingViewController: 
    // UIView *parentView = self.presentingViewController.view; 

    UIGraphicsBeginImageContext(parentView.bounds.size); 
    [parentView.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *parentViewImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    // insert an image view with a picture of the parent view at the back of our view's subview stack... 
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.view.bounds]; 
    imageView.image = parentViewImage; 
    [self.view insertSubview:imageView atIndex:0]; 
    [imageView release]; 
} 

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 

    // remove our image view containing a picture of the parent view at the back of our view's subview stack... 
    [[self.view.subviews objectAtIndex:0] removeFromSuperview]; 
} 
+1

Dla iOS 5 należy użyć 'presentationViewController' zamiast' parentViewController'. Zaktualizowałem twoją odpowiedź, aby to uwzględnić. –

+0

To w większości działa świetnie, ale gdy go wypróbuję dostaję lukę 20 px na górze obrazu widoku rodzica spowodowanego (zgaduję) przez pasek stanu. Wszelkie sugestie, aby to poprawić? – Mac

+0

Aktualizacja: Udało mi się naprawić, tłumacząc mój kontekst obrazu 20 pikseli w górę, ale wciąż jestem ciekawy, dlaczego musiałem, kiedy wydaje się, że nikt inny nie ma? – Mac

Powiązane problemy