Verwendung von presentModalViewController zum Erstellen einer transparenten Ansicht

80

Ich zeige eine modale Ansicht mit

[self presentModalViewController:controller animated:YES];

Wenn die Ansicht den Bildschirm nach oben bewegt, ist sie gemäß der Einstellung in der XIB-Datei, aus der sie erstellt wurde, transparent. Sobald sie den Bildschirm ausfüllt, wird sie undurchsichtig.

Gibt es überhaupt eine Möglichkeit, die Ansicht transparent zu halten?

Ich vermute, dass die Ansicht, über die es gelegt wird, nicht gerendert wird, sondern dass die modale Ansicht undurchsichtig wird.

Darryl Braaten
quelle
1
Diese Frage ist jetzt ziemlich alt. Wenn Sie nach Antworten suchen, suchen Sie nach einer, die für die von Ihnen verwendete iOS-Version gilt.
Darryl Braaten
Dieser stackoverflow.com/q/27598846/1603234 bringt mich zum Lächeln, jetzt bist du dran :)
Hemang
Sie können verwendenviewcontroller.modalPresentationStyle = .FormSheet
Gerald

Antworten:

63

Ihre Ansicht ist immer noch transparent, aber sobald sich Ihr modaler Controller oben im Stapel befindet, wird die Ansicht dahinter ausgeblendet (wie dies bei jedem obersten Ansichtscontroller der Fall ist). Die Lösung besteht darin, eine Ansicht selbst manuell zu animieren. dann wird der Behind-ViewController nicht ausgeblendet (da Sie ihn nicht "verlassen" haben).

Ben Gottlieb
quelle
Danke, das bestätigt, was ich vermutet habe.
Darryl Braaten
1
Ich habe bei Apple einen Fehlerbericht zu diesem Problem eingereicht. Open Radar: openradar.appspot.com/radar?id=1062402
Theorie
4
Das Problem dabei ist, dass die dargestellte Ansicht keine eigenen Autorotationseinstellungen haben kann.
Shizam
85

Nach iOS 3.2 gibt es eine Methode, um dies ohne „Tricks“ zu tun - siehe die Dokumentation zur modalPresentationStyle-Eigenschaft . Sie haben einen rootViewController, der den viewController anzeigt. Hier ist der Code zum Erfolg:

viewController.view.backgroundColor = [UIColor clearColor];
rootViewController.modalPresentationStyle = UIModalPresentationCurrentContext;
[rootViewController presentModalViewController:viewController animated:YES];

Bei dieser Methode ist der Hintergrund des viewControllers transparent und der zugrunde liegende rootViewController ist sichtbar. Bitte beachten Sie, dass dies nur auf dem iPad zu funktionieren scheint, siehe Kommentare unten.

Unendliche Möglichkeiten
quelle
1
Hi .. +1 von meiner Seite bcoz es funktioniert gut in iOS 4 und iPad. aber wie es in iPhone 3.0 funktionieren wird. Danke
Mitesh Khatri
3
Es funktioniert nicht bei mir (iOS 5.0). Kann jemand Code anzeigen?
Daniel
6
Dies scheint nicht auf dem iPhone / iPod zu funktionieren, sondern nur auf dem iPad (siehe Dokumentation in der Antwort). @simpleBob: Vielleicht funktioniert es deshalb nicht für dich?
Mac
1
Zu Ihrer Information
The Crazy Chimp
1
Ich habe auf iOS 8 getestet und muss es Over Current Contextals Präsentationsstil verwenden.
Haxpor
48

Was ich brauchte, um das zum Laufen zu bringen:

self.window.rootViewController.modalPresentationStyle = UIModalPresentationCurrentContext;
Mitternachtsdavid
quelle
1
es funktioniert einfach, danke, ich habe gerade meinen Code auf - (BOOL) -Anwendung: (UIApplication *) -Anwendung didFinishLaunchingWithOptions: (NSDictionary *) launchOptions-Methode und voila
Kshitiz Ghimire
2
Sie können das auch einfach modalPresentationStyleauf dem präsentierenden Ansichts-Controller einstellen (anstatt auf dem des Fensters rootViewController).
mbinna
Vielen Dank!! funktioniert sogar, wenn Sie dies tun, [self performSegueWithIdentifier: @ "open" sender: self];
DogCoffee
Sie können die Ansicht jederzeit von Hand in viewdidload des Modals animieren.
Jacob K
2
Beachten Sie, dass, wie Herr T. unten sagte, der modalPresentationStyle auf dem View Controller eingestellt werden muss, der derzeit den Vollbildmodus hat.
Jessepinho
24

Für diejenigen, die Code sehen möchten, habe ich Folgendes zum Controller meiner transparenten Ansicht hinzugefügt:

// Add this view to superview, and slide it in from the bottom
- (void)presentWithSuperview:(UIView *)superview {
    // Set initial location at bottom of superview
    CGRect frame = self.view.frame;
    frame.origin = CGPointMake(0.0, superview.bounds.size.height);
    self.view.frame = frame;
    [superview addSubview:self.view];            

    // Animate to new location
    [UIView beginAnimations:@"presentWithSuperview" context:nil];
    frame.origin = CGPointZero;
    self.view.frame = frame;
    [UIView commitAnimations];
}

// Method called when removeFromSuperviewWithAnimation's animation completes
- (void)animationDidStop:(NSString *)animationID
                finished:(NSNumber *)finished
                 context:(void *)context {
    if ([animationID isEqualToString:@"removeFromSuperviewWithAnimation"]) {
        [self.view removeFromSuperview];
    }
}

// Slide this view to bottom of superview, then remove from superview
- (void)removeFromSuperviewWithAnimation {
    [UIView beginAnimations:@"removeFromSuperviewWithAnimation" context:nil];

    // Set delegate and selector to remove from superview when animation completes
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];

    // Move this view to bottom of superview
    CGRect frame = self.view.frame;
    frame.origin = CGPointMake(0.0, self.view.superview.bounds.size.height);
    self.view.frame = frame;

    [UIView commitAnimations];    
}
Kristopher Johnson
quelle
Das einzige Problem, das ich mit dieser Lösung habe, ist die Speicherverwaltung. Zum Beispiel: TestViewController * testView = [[TestViewController-Zuweisung] initWithNibName: @ "TestView" -Paket: nil]; [testView presentWithSuperview: self.navigationController.view]; Funktioniert einwandfrei. Wenn Sie jedoch versuchen, die Ansicht freizugeben oder automatisch freizugeben, führen alle Aufrufe von Methoden in dieser Ansicht zu Ausnahmen für den fehlerhaften Zugriff
Mick Walker,
Bist du sicher? Ich denke, die Ansicht wird von [Superview AddSubview:] beibehalten, sodass Sie sie freigeben können sollten.
Kristopher Johnson
Wenn Sie presentWithSuperview aufrufen, geben Sie testView frei, es stürzt ab. Es zeigt auch Anzeigen "unter" allen NavigationController-Symbolleisten usw. an
Ryan Booker
Das hat bei mir schon lange gut funktioniert, aber im Querformat funktioniert es nicht mehr. Hat jemand das gleiche Problem?
Jeffry van de Vuurst
19

Die von Apple genehmigte Methode, dies in iOS 8 zu tun, besteht darin, den modalPresentationStyle auf 'UIModalPresentationOverCurrentContext' zu setzen.

Aus der UIViewController-Dokumentation:

UIModalPresentationOverCurrentContext

Ein Präsentationsstil, bei dem der Inhalt nur über den Inhalt des übergeordneten Ansichtscontrollers angezeigt wird. Die Ansichten unter dem präsentierten Inhalt werden nach Abschluss der Präsentation nicht aus der Ansichtshierarchie entfernt. Wenn der dargestellte Ansichts-Controller den Bildschirm nicht mit undurchsichtigem Inhalt füllt, wird der zugrunde liegende Inhalt durchscheint.

Wenn Sie einen Ansichtscontroller in einem Popover präsentieren, wird dieser Präsentationsstil nur unterstützt, wenn der Übergangsstil UIModalTransitionStyleCoverVertical ist. Der Versuch, einen anderen Übergangsstil zu verwenden, löst eine Ausnahme aus. Sie können jedoch andere Übergangsstile verwenden (mit Ausnahme des partiellen Curl-Übergangs), wenn sich der übergeordnete Ansichtscontroller nicht in einem Popover befindet.

Verfügbar in iOS 8.0 und höher.

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/

Das Video "View Controller Advancements in iOS 8" von WWDC 2014 geht ausführlich darauf ein.

Stellen Sie sicher, dass Ihr dargestellter Ansichts-Controller eine klare Hintergrundfarbe hat (andernfalls erscheint er immer noch undurchsichtig).

Jeff C.
quelle
es gibt mir einen schwarzen Bildschirm auf iOS8 und iOS9
Amit Hooda
Tatsächlich funktioniert es, wenn Sie die Ansicht Ihres View Controllers auf eine Hintergrundfarbe mit einem Alpha-Wert unter 1
einstellen
16

Es gibt noch eine andere Option: Machen Sie vor dem Anzeigen des Modal Controllers einen Screenshot des gesamten Fensters. Fügen Sie das aufgenommene Bild in eine UIImageView ein und fügen Sie die Bildansicht der Ansicht des Controllers hinzu, die Sie anzeigen möchten. Dann zurück senden. Fügen Sie eine weitere Ansicht über der Bildansicht ein (Hintergrund schwarz, Alpha 0,7). Zeigen Sie Ihren Modal Controller und es sieht so aus, als wäre er transparent. Ich habe es gerade auf dem iPhone 4 mit iOS 4.3.1 versucht. Wie Charme.

Krumelur
quelle
gut, ich implementiere dies, es war großartig für mich. Füge meinen Code hinzu, der diesem Konzept folgt.
Ishu
Niemand hat gesagt, dass es einfach wird! :-)
Krumelur
Wie würden Sie die Gerätedrehung mit diesem Ansatz unterstützen?
Kyle Clegg
10

Das ist ziemlich alt, aber ich habe das gleiche Problem wie folgt gelöst: Da ich einen Navigationscontroller auf dem iPhone präsentieren muss, war das Hinzufügen einer Unteransicht keine praktikable Lösung.

Also, was ich getan habe:

1) Machen Sie vor der Präsentation des View Controllers einen Screenshot Ihres aktuellen Bildschirms:

UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, self.view.opaque, 0.0);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage * backgroundImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

2) Erstellen Sie den Ansichts-Controller, den Sie präsentieren möchten, und fügen Sie den Hintergrund als Unteransicht hinzu, um ihn an zurück zu senden.

UIViewController * presentingVC = [UIViewController new];
UIImageView * backgroundImageOfPreviousScreen = [[UIImageView alloc] initWithImage:backgroundImage];
[presentingVC.view addSubview:backgroundImageOfPreviousScreen];
[presentingVC.view sendSubviewToBack:backgroundImageOfPreviousScreen];

3) Präsentieren Sie Ihren Ansichts-Controller, aber fügen Sie zuvor im neuen Ansichts-Controller eine transparente Ansicht in viewDidLoad hinzu (ich habe ILTranslucentView verwendet).

-(void)viewDidLoad
{
    [super viewDidLoad];
    ILTranslucentView * translucentView = [[ILTranslucentView alloc] initWithFrame:self.view.frame];
    [self.view addSubview:translucentView];
    [self.view sendSubviewToBack:translucentView];
}

Und das ist alles!

lucaslt89
quelle
Genial. Neben der durchscheinenden Ansicht, die zum Verschwinden des Screenshots führte, funktionierte alles einwandfrei.
Michal Shatz
Dies ist eine großartige Lösung! Es ist besser, den Controller-Code für das Popup vom übergeordneten View-Controller getrennt zu halten.
1kmonkies
Für mich hat funktioniert, aber das Setzen des Hintergrunds musste in viewWillAppear
Leszek Zarna
5

Ich habe meine Erkenntnisse dazu in einer anderen Frage niedergeschrieben , aber das Wesentliche ist, dass Sie sich modalPresentationStyle = UIModalPresentationCurrentContextan alles wenden müssen, was im Moment den Vollbildmodus besitzt. Meistens ist es der rootViewController von [UIApplication sharedApplication] .delegate.window. Es könnte sich auch um einen neuen UIViewController handeln, der vorgestellt wurde modalPresentationStyle = UIModalPresentationFullScreen.

Bitte lesen Sie meinen anderen viel detaillierteren Beitrag, wenn Sie sich fragen, wie ich dieses Problem speziell gelöst habe. Viel Glück!

Herr T.
quelle
5

Dies scheint in IOS 8 fehlerhaft zu sein. Ich verwende einen Navigationscontroller und der angezeigte Kontext ist der Kontext der Navigationsmenüs, in unserem Fall ein verschiebbarer Menücontroller.

Wir verwenden den Pod 'TWTSideMenuViewController'. '0.3' hat noch nicht überprüft, ob dies ein Problem mit der Bibliothek oder der oben beschriebenen Methode ist.

Konstantin
quelle
5

Dies hat bei iOS 8-9 funktioniert:

1- Stellen Sie den Hintergrund Ihres View Controllers mit einem Alpha ein

2- Fügen Sie diesen Code hinzu:

TranslucentViewController *tvc = [[TranslucentViewController alloc] init];
self.providesPresentationContextTransitionStyle = YES;
self.definesPresentationContext = YES;
[tvc setModalPresentationStyle:UIModalPresentationOverCurrentContext];

[self.navigationController presentViewController:tvc animated:YES completion:nil];
mkai
quelle
4

Ich weiß, das ist eine ziemlich alte Frage. Ich war in dieser Angelegenheit festgefahren und konnte einen Hinweis von diesem Thread bekommen. Also hier setzen, wie ich es geschafft habe :). Ich verwende ein Storyboard und bin zum ViewController übergegangen, der vorgestellt werden soll. Der View Controller hat eine transparente Hintergrundfarbe. Jetzt habe ich im Attributinspektor des Segues die Präsentation auf "Über aktuellen Kontext" gesetzt. Und es hat bei mir funktioniert. Ich entwickle für das iPhone.

Attribute Inspector des Segues

Rojil Thomas
quelle
danke, funktioniert auch durch Set UIModalPresentationStyle.OverCurrentContext programmgesteuert
guoleii
3

Ich habe die offene Soruce-Bibliothek MZFormSheetController erstellt , um das modale Formularblatt auf einem zusätzlichen UIWindow zu präsentieren. Sie können es verwenden, um den modalen Ansichts-Controller für Transparenz darzustellen und sogar die Größe des dargestellten Ansichts-Controllers anzupassen.

Michal Zaborowski
quelle
Können Sie erklären, wie man es benutzt? Denn wenn ich versuche, den Code aufzurufen, verursacht dies SIGABRT.
Matrosov Alexander
3

In meinem Zustand habe ich Blick auf den gleichen viewController. Erstellen Sie also einen neuen Ansichts-Controller zum Halten von UIView. Machen Sie diese Ansicht transparent, indem Sie die Alpha-Eigenschaft festlegen. Dann auf einen Knopfdruck habe ich diesen Code geschrieben. Es sieht gut aus.

UIGraphicsBeginImageContext(objAppDelegate.window.frame.size);
    [objAppDelegate.window.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();



    UIViewController *controllerForBlackTransparentView=[[[UIViewController alloc] init] autorelease];
    [controllerForBlackTransparentView setView:viewForProfanity];

    UIImageView *imageForBackgroundView=[[UIImageView alloc] initWithFrame:CGRectMake(0, -20, 320, 480)];
    [imageForBackgroundView setImage:viewImage];

    [viewForProfanity insertSubview:imageForBackgroundView atIndex:0];

    [self.navigationController presentModalViewController:controllerForBlackTransparentView animated:YES];

Und es zeigt, was ich will. hoffe es hilft jemandem.

Ishu
quelle
2

Hier ist eine Kategorie, die ich erstellt habe, um das Problem zu lösen.

    //
    //  UIViewController+Alerts.h
    //

    #import <UIKit/UIKit.h>

    @interface UIViewController (Alerts)

    - (void)presentAlertViewController:(UIViewController *)alertViewController animated:(BOOL)animated;
    - (void)dismissAlertViewControllerAnimated:(BOOL)animated;

    @end


    //
    //  UIViewController+Alerts.m
    //

    #import "UIViewController+Alerts.h"

    @implementation UIViewController (Alerts)

    - (void)presentAlertViewController:(UIViewController *)alertViewController animated:(BOOL)animated
    {
            // Setup frame of alert view we're about to display to just off the bottom of the view
            [alertViewController.view setFrame:CGRectMake(0, self.view.frame.size.height, alertViewController.view.frame.size.width, alertViewController.view.frame.size.height)];

            // Tag this view so we can find it again later to dismiss
            alertViewController.view.tag = 253;

            // Add new view to our view stack
            [self.view addSubview:alertViewController.view];

            // animate into position
            [UIView animateWithDuration:(animated ? 0.5 : 0.0) animations:^{
                    [alertViewController.view setFrame:CGRectMake(0, (self.view.frame.size.height - alertViewController.view.frame.size.height) / 2, alertViewController.view.frame.size.width, alertViewController.view.frame.size.height)];
            }];      
    }

    - (void)dismissAlertViewControllerAnimated:(BOOL)animated
    {
            UIView *alertView = nil;

            // find our tagged view
            for (UIView *tempView in self.view.subviews)
            {
                    if (tempView.tag == 253)
                    {
                            alertView = tempView;
                            break;
                    }
            }

            if (alertView)
            {
                    // clear tag
                    alertView.tag = 0;

                    // animate out of position
                    [UIView animateWithDuration:(animated ? 0.5 : 0.0) animations:^{
                            [alertView setFrame:CGRectMake(0, self.view.frame.size.height, alertView.frame.size.width, alertView.frame.size.height)];
                    }];      
            }
    }

    @end
Dave Wood
quelle
4
Zu Ihrer Information, Sie müssen die Unteransichten bei der Entlassungsmethode nicht selbst durchlaufen. Das Framework erledigt dies für Sie mit [self.view viewWithTag: 253];
SteveB
In der Kategorie von Dave Wood in diesem Beispiel wird Ihre Ansicht unverändert angezeigt. Sie müssen also auch den Hintergrund der Alpha-Einstellung der xib-Ansicht auf weniger als 1 einstellen, um den durchscheinenden Effekt zu erzielen.
Basil Bourque
Diese Kategorie hat ein Problem beim Präsentieren über eine scrollbare Ansicht wie eine Tabellenansicht: Das Scrollen funktioniert. Das ist schlecht. Der Benutzer kann die dargestellte Ansicht außerhalb des Bildschirms scrollen. Der Inhalt der zugrunde liegenden Präsentationsansicht wird auf dem Bildschirm angezeigt.
Basil Bourque
Ich habe diese Kategorie seitdem aktualisiert. Den Code erhalten Sie hier: gist.github.com/4423365 . Ich verwende es über Tabellen- und Sammlungsansichten ohne das von Ihnen beschriebene Bildlaufproblem.
Dave Wood
2

Nach vielen Recherchen wird dies unser Problem lösen und unseren Zweck erfüllen.

Erstellen Sie einen Übergang von der Quell-VC zur Ziel-VC mit einer Kennung.

Beispiel: "goToDestinationViewController" ist in Ordnung, um das Leben zu vereinfachen. Betrachten wir den aktuellen Ansichts-Controller, dh den, den Sie hinter Ihrer transparenten Ansicht als Quelle und das Ziel als Ziel haben möchten

Jetzt in Quell-VC in viewDidLoad: oder Ansicht

performSegueWithIdentifier("goToDestinationViewController", sender: nil)

Gut, wir sind auf halbem Weg. Gehen Sie jetzt zu Ihrem Storyboard. Klicken Sie auf den Abschnitt. das sollte so aussehen: segue

Ändern Sie die Optionen in die angezeigten Optionen.

Jetzt kommt die echte Lösung.

Fügen Sie diesen Code in viewDidLoad Ihres Zielansichts-Controllers hinzu.

self.modalPresentationStyle = .Custom

.................................................. .......................SO EINFACH......................... .........................................

Karthik Vinnakota
quelle
1
Die Einstellung self.modalPresentationStyle = .customfunktioniert für mich bei der modalen Darstellung eines tatsächlichen Ansichts-Controllers mit transparentem Hintergrund in Swift 3, Xcode 8. Das einzige Problem besteht darin, dass die Registerkartenleiste vor dem transparenten angezeigt wird, wenn der präsentierende Ansichts-Controller in einen Registerkarten-Controller eingebettet ist Hintergrundansicht.
Mtso
Wenn also eine Registerkartenleiste verwendet wird, tabBarController.tabBar.isHiddensollten die Controller für die präsentierende Ansicht auf eingestellt werden true.
Mtso
1

Alternativ können Sie auch eine "Containeransicht" verwenden. Machen Sie einfach Alpha unter 1 und binden Sie es mit der Sequenz ein. XCode 5, Ziel iOS7.

kann kein Bild zeigen, nicht genug Ruf)))

Containeransicht ab iOS6 verfügbar.

Mike Glukhov
quelle
1

Dieser Code funktioniert auf dem iPhone unter iOS6 und iOS7 einwandfrei:

presentedVC.view.backgroundColor = YOUR_COLOR; // can be with 'alpha'
presentingVC.modalPresentationStyle = UIModalPresentationCurrentContext;
[presentingVC presentViewController:presentedVC animated:YES completion:NULL];

Auf diese Weise verlieren Sie jedoch die Animation "Slide-from-the-Bottom".

Malex
quelle
Das funktioniert bei mir auf dem iPhone nicht. Die Unteransicht verschwindet immer noch. Ich glaube, modalPresentationStyle gilt nur für das iPad.
Jessepinho
Wenn Sie möchten, kann ich Ihnen Bildschirme des resultierenden Effekts senden. Möglicherweise stimmt etwas mit Ihrer Implementierung nicht.
Malex
Ah ... es war, weil ich nicht wusste, dass der View Controller Vollbild sein muss. (Siehe den Kommentar von Herrn T.)
Jessepinho
1

Ich habe diese elegante und einfache Lösung für iOS 7 und höher gefunden!

Für iOS 8 hat Apple UIModalPresentationOverCurrentContext hinzugefügt, aber es funktioniert nicht für iOS 7 und frühere Versionen, sodass ich es für meinen Fall nicht verwenden konnte.

Bitte erstellen Sie die Kategorie und geben Sie den folgenden Code ein.

.h Datei

typedef void(^DismissBlock)(void);

@interface UIViewController (Ext)

- (DismissBlock)presentController:(UIViewController *)controller
              withBackgroundColor:(UIColor *)color
                         andAlpha:(CGFloat)alpha
                presentCompletion:(void(^)(void))presentCompletion;

@end

.m Datei

#import "UIViewController+Ext.h"

@implementation UIViewController (Ext)

- (DismissBlock)presentController:(UIViewController *)controller
              withBackgroundColor:(UIColor *)color
                         andAlpha:(CGFloat)alpha
                presentCompletion:(void(^)(void))presentCompletion
{
    controller.modalPresentationStyle = UIModalPresentationCustom;

    UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow;
    __block UIView *overlay = [[UIView alloc] initWithFrame:keyWindow.bounds];
    if (color == nil) {
        color = [UIColor blackColor];
    }
    overlay.backgroundColor = color;
    overlay.alpha = alpha;

    if (self.navigationController != nil) {
        [self.navigationController.view addSubview:overlay];
    }
    else if (self.tabBarController != nil) {
        [self.tabBarController.view addSubview:overlay];
    }
    else {
        [self.view addSubview:overlay];
    }

    self.modalPresentationStyle = UIModalPresentationCurrentContext;
    [self presentViewController:controller
                       animated:true
                     completion:presentCompletion];

    DismissBlock dismissBlock = ^(void) {
        [self dismissViewControllerAnimated:YES completion:nil];
        [UIView animateWithDuration:0.25
                         animations:^{
                             overlay.alpha = 0;
                         } completion:^(BOOL finished) {
                             [overlay removeFromSuperview];
                         }];
    };
    return dismissBlock;
}

@end

Hinweis: Es funktioniert auch für navigationContoller, tabBarController.

Anwendungsbeispiel:

       // Please, insure that your controller has clear background
       ViewController *controller = [ViewController instance];
        __block DismissBlock dismissBlock = [self presentController:controller
                                                withBackgroundColor:[UIColor blackColor]
                                                           andAlpha:0.5
                                                  presentCompletion:nil];
        // Supposed to be your controller's closing callback
        controller.dismissed = ^(void) {
            dismissBlock();
        };

Geniesse es! und bitte hinterlassen Sie einige Rückmeldungen.

Karen Lusinyan
quelle
0

Dies ist der beste und sauberste Weg, den ich bisher gefunden habe:

@protocol EditLoginDelegate <NSObject>

- (void)dissmissEditLogin;

@end

- (IBAction)showtTransparentView:(id)sender {

    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"foo bar"
                                                         delegate:self
                                                cancelButtonTitle:@"cancel"
                                           destructiveButtonTitle:@"destructive"
                                                otherButtonTitles:@"ok", nil];

    [actionSheet showInView:self.view];

}

- (void)willPresentActionSheet:(UIActionSheet *)actionSheet{

    UIStoryboard *loginStoryboard     = [UIStoryboard storyboardWithName:@"Login" bundle:nil];
    self.editLoginViewController      = [loginStoryboard instantiateViewControllerWithIdentifier:@"EditLoginViewController"];

    self.editLoginViewController.delegate = self;

    [self.editLoginViewController viewWillAppear:NO];
    [actionSheet addSubview:self.editLoginViewController.view];
    [self.editLoginViewController viewDidAppear:NO];
}
MUH Mobile Inc.
quelle
0

Ich versuche, mehrere Methoden zu verwenden, um zu lösen, aber immer noch fehlgeschlagen, der folgende Code schließlich implementiert.

Die Entschließung von Swift:

// A.swift init method
modalPresentationStyle = .currentContext // or overCurrentContent
modalTransitionStyle = .crossDissolve // dissolve means overlay

dann in B view controller:

// B.swift
let a = A()
self.present(a, animated: true, completion: nil)
Jone
quelle
Sie müssen die Hintergrundfarbe der Ansicht des ViewControllers so gestalten, dass sie auch transparent ist. view.backgroundColor = UIColor.clear
Michael Henry