19

Ich habe ein Dilema, ich möchte dem Benutzer eine halbtransparente Ansicht präsentieren.Transparenter Hintergrund mit einem Modal UIViewController

Ich habe herausgefunden, dass, wenn ich einfach die transparente Ansicht an den Anfang des Stapels meines NavigationControllers geschoben habe, dass es nicht die Transparenzlevel wiedergeben würde, die ich wollte. Also beschloss ich, die Ansicht einfach als Unteransicht der aktuellen Ansicht oben im Stapel hinzuzufügen.

Diese Lösung funktioniert, die Ansicht unten ist noch sichtbar, und die Ansicht ist 'semi-modal'. Das Problem ist, wenn die übergeordnete Ansicht von UITableViewController erbt (wie meins), dann die Ansicht, die ich darauf "drehe", nicht die Navigationsleiste am oberen Rand.

Ich möchte wirklich nicht in eine Situation geraten, in der ich die Steuerelemente in der Navigationsleiste jedes Mal, wenn ich diese Ansicht drücke, aktivieren/deaktivieren musste. Ich fragte mich, ob jemand von Lösungen wusste, die ich verwenden konnte so dass die Ansicht, die ich auf den UITableViewController schiebe, tatsächlich die Navigationsleiste "überstülpt"?

+0

http://stackoverflow.com/questions/12741224/ios-modal-viewcontroller-with-transparent-background/22829068#22829068 – Zaraki

Antwort

13

Komisch, ich habe gestern gerade das Gleiche gemacht. Leider scheint es unmöglich zu sein. Sobald der modale Ansicht-Controller vorhanden ist, wird die vorherige Ansicht ausgeblendet. Siehe hierzu previous question on the topic.

Sie noch die View-Controller und NIB Dateien, die Sie eingerichtet haben können - hier ist mein Beispielcode

- (void)showUpgrade { 
    [self.upgradeVC viewWillAppear:NO]; 
    [self.view addSubview:self.upgradeVC.view]; 
    [self.upgradeVC viewDidAppear:NO]; 
} 

- (void)hideUpgrade { 
    [self.upgradeVC viewWillDisappear:NO]; 
    [self.upgradeVC.view removeFromSuperview]; 
    [self.upgradeVC viewDidDisappear:NO]; 
} 

- (UpgradeViewController *)upgradeVC { 
    if (_upgradeVC == nil) { 
     _upgradeVC = [[UpgradeViewController alloc] initWithNibName:[NSString stringWithFormat:@"UpgradeView_%@", self.deviceType] bundle:nil]; 
     _upgradeVC.delegate = self; 
    } 
    return _upgradeVC; 
} 

Sie so einen Verweis auf den übergeordneten View-Controller in den Modal-View-Controller speichern müssen, dass Sie kann auf die -hide Methode zugreifen. Ich habe das über einen Delegierten getan.

Es wäre auch einfach, einige Animationen zu -show und -hide hinzuzufügen, wenn Sie möchten, dass es von der Unterseite des Bildschirms animieren - ich war einfach zu faul, dies zu tun.

+0

Ich glaube nicht, Apple SDK ermöglicht eine transparente bg auf einem UIViewController auf dem iPhone. –

+0

Wie gehen Sie dabei mit den unterschiedlichen Orientierungen des Geräts um? Es scheint mir, dass es immer die Hochformatansicht laden wird, was ein Problem ist, wenn die aktuelle Ansicht in der Landschaft ist. –

+0

das ist keine gute Praxis. Schau dir diesen Artikel an. Es geht darum, warum das Hinzufügen einer VC-Ansicht zu einer anderen als Teilansicht eine schlechte Idee ist. http://blog.carbonfive.com/2011/03/09/abusing-uiviewcontrollers/ – hackerinheels

-2

Haben Sie versucht, die Unteransichten des Modal View Controllers zu durchlaufen und die Hintergrundfarbe für jede Ansicht zu ändern? Dies ist eine rekursive DFS-Funktion.

- (void)setBackgroundToClearForView:(UIView *)view { 
    if ([view subviews]) { 
     for (UIView *subView in [view subviews]) { 
      [self setBackgroundToClearForView:subView]; 
     } 
    } 

    if ([view respondsToSelector:@selector(setBackgroundColor:)]) { 
     [view performSelector:@selector(setBackgroundColor:) 
        withObject:[UIColor clearColor]]; 
    } 
} 

Um es aufrufen:

[self setBackgroundToClearForView:self.view]; 

in viewDidLoad.

+0

Ich habe dies nicht selbst versucht, aber mein Verständnis ist, dass die Elternansicht tatsächlich entfernt wird der Ansichtsstapel Siehe: http://stackoverflow.com/questions/587681/how-to-use-presentmodalviewcontroller-to-create-a-transparent-view – pix0r

-2

Dies wird den Trick machen .. Versuchen Sie dieses.

// for clear color or you can easily adjust the alpha here 
YourVC *vc=[[YourVC alloc]initWithNibName:@"YourVC" bundle:nil] ; 
vc.view.backgroundColor = [UIColor clearColor]; 
self.modalPresentationStyle = UIModalPresentationCurrentContext; 
[self presentViewController:vc animated:NO completion:nil]; 

Damit wird die Ansicht Vollbild im Gegensatz zu UIModalPresentationFormSheet sein ..

+3

hat nicht für mich gearbeitet. – mxcl

+1

Dies funktioniert nicht, aus den beschriebenen Gründen - die Hintergrundansichten werden nach Modal-Präsentation entfernt. – tooluser

11

Es gibt jetzt eine Möglichkeit, dies mit iOS7 individuellen Übergänge zu erreichen:

MyController * controller = [MyController new]; 
[controller setTransitioningDelegate:self.transitionController]; 
controller.modalPresentationStyle = UIModalPresentationCustom; 
[self controller animated:YES completion:nil]; 

Um Ihren benutzerdefinierten Übergang zu erstellen, müssen Sie 2 Dinge:

  • Ein TransitionDelegate Objekt (implementierende <UIViewControllerTransitionDelegate>)
  • Ein "AnimatedTransitioning" Objekt (Implementierung <UIViewControllerAnimatedTransitioning>)

Sie können weitere Informationen auf individuelle Übergänge in diesem Tutorial: http://www.doubleencore.com/2013/09/ios-7-custom-transitions/

0

Try this:

ViewController *vc = [[ViewController alloc] init]; 
[vc setModalPresentationStyle:UIModalPresentationOverCurrentContext]; 
[self presentViewController:vc animated:YES completion:nil]; 
+0

Ich habe es versucht, es funktioniert nicht :( – Supertecnoboff

13

iOS 8 hinzugefügt, um die UIModalPresentationOverFullScreenpresentation style. Legen Sie dies als modalPresentationStyle des präsentierten Ansichtscontrollers fest. Weitere Informationen zu erweiterten Anforderungen finden Sie unter Erstellen einer benutzerdefinierten presentation controller.

+0

Danke! Das hat perfekt für mich funktioniert :) – Supertecnoboff

+0

Dies sollte die richtige Antwort sein, jetzt, da iOS 8+ eine Adoption von> 91% auf iOS-Geräten ab dem 24. Oktober hat, 2015. – Manuel

Verwandte Themen