iOS: Modaler ViewController mit transparentem Hintergrund

179

Ich versuche, einen Ansichts-Controller modal mit einem transparenten Hintergrund darzustellen. Mein Ziel ist es, die Ansicht der präsentierenden und der präsentierten View Controller gleichzeitig anzeigen zu lassen. Das Problem ist, dass nach Abschluss der Präsentationsanimation die Ansicht des Präsentationsansichts-Controllers verschwindet.

- (IBAction)pushModalViewControllerButtonPressed:(id)sender
{
    ModalViewController *modalVC = [[ModalViewController alloc] init];
    [self presentViewController:modalVC animated:YES completion:nil];
}

Ich weiß, dass ich die Ansicht einfach als Unteransicht hinzufügen könnte, aber ich möchte diese Lösung aus irgendeinem Grund vermeiden. Wie könnte ich das beheben?

Michael
quelle
4
@TheKing Klingt so, als ob Michael wie ich möchte, dass die modale Ansicht durchscheinend ist und als schwebende Gelschicht über der primären (präsentierenden) Ansicht erscheint. Erzeugt das Gefühl, dass der Benutzer im aktuellen Kontext bleibt, während er eine schnelle Einstellung vornimmt, anstatt zu anderen wichtigen Funktionen (in einer separaten Ansicht) zu wechseln.
Basil Bourque
Dieser stackoverflow.com/q/27598846/1603234 bringt mich zum Lächeln, jetzt bist du dran :)
Hemang
Siehe meine Antwort hier stackoverflow.com/a/29794201/1606125 für iOS 8
Pankaj Wadhwa
schnelle Version hier stackoverflow.com/a/34578402/3380878
Mojtabye
1
Für iOS 10 funktioniert UIModalPresentationOverFullScreen wie inigo333 unten erwähnt.
Josef Rysanek

Antworten:

97

Dieser folgende Code funktioniert nur auf dem iPad.

self.view.backgroundColor = [UIColor clearColor];
self.modalPresentationStyle = UIModalPresentationCurrentContext;
[self presentModalViewController:modalVC animated:YES];

Ich würde mit dem Hinzufügen einer Unteransicht gehen.

Hier ist eine sehr gute Diskussion. Schauen Sie sich die Kommentare genau an. Nicht nur die Antwort.

Modale Ansicht

Wenn ich du wäre, würde ich es nicht tun. Ich würde eine Unteransicht hinzufügen und es tun. Es scheint mir eine bessere Kontrolle über die Dinge zu geben.

BEARBEITEN:

Wie von Paul Linsay erwähnt, ist seit iOS 8 nur UIModalPresentationOverFullScreender modalPresentationStyle des ViewController erforderlich. Dies würde auch Navigationsleisten- und Registerkartenschaltflächen abdecken.

SP
quelle
18
Es funktioniert unter iOS 7 und auch auf dem iPhone. Die Sache ist, dass Sie die modalPresentationStyle = UIModalPresentationCurrentContextauf dem Presenter View Controller angeben müssen und nicht in der vorgestellten .
redent84
6
Ja, es funktioniert, aber NUR, wenn Sie dies auf der höheren Ebene ViewControllerIhrer Ansichtshierarchie festlegen . (z. B. a NavigationControlleroder die Instanz Ihres Dia-Menüansichts-Controllers zum Beispiel).
iGranDav
4
Seltsamerweise funktionierte es in meinem Fall nur, nachdem der Modalstil auf eingestellt wurde UIModalPresentationCustom, und nur, wenn er direkt vor presentViewControllerund nicht in eingestellt wurde viewDidLoad.
Mojuba
5
Seit iOS 8 ist lediglich UIModalPresentationOverFullScreen für den modalPresentationStyle des dargestellten ViewControllers erforderlich.
Paul Linsay
1
Nach ungefähr 1000 Versuchen wurde mir klar, dass Sie modalPresentationStyle vorherviewDidLoad einstellen müssen . Ich habe es im Konstruktor gemacht und es hat funktioniert.
Bendytree
186

Für diejenigen, die versuchen, dies in iOS 8 zum Laufen zu bringen, ist die "von Apple genehmigte" Möglichkeit, einen transparenten Controller modalPresentationStyle für die modale Ansicht anzuzeigen, die Einstellung auf dem aktuellen ED- Controller auf UIModalPresentationOverCurrentContext.

Dies kann im Code oder durch Festlegen der Eigenschaften des Segues im Storyboard erfolgen.

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 Ansichts-Controller 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/documentation/uikit/uiviewcontroller

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

Hinweis:

  • Stellen Sie sicher, dass Ihr präsentierter Ansichts-Controller eine klare Hintergrundfarbe hat, damit er nicht wirklich durchsichtig wird!
  • Sie müssen dies vor dem Präsentieren festlegen , dh das Festlegen dieses Parameters im viewDidLoadpräsentierten ViewController hat keine Auswirkungen
Jeff C.
quelle
32
Hinweis - Es scheint, dass sich das Ziel, für das Sie modalPresentationStyle festlegen müssen, geändert hat. In iOS 7 musste ich beispielsweise den modalPresentationStyle der View Controller festlegen, die versuchten, das Modal für UIModalPresentationCurrentContext zu öffnen, damit dies funktioniert . Damit dies in iOS8 funktioniert, musste ich jedoch den modalPresentationStyle der modalen Ansicht festlegen, der in UIModalPresentationOverCurrentContext angezeigt werden soll .
u2Fan
1
Wenn Sie Segues in Ihren Storyboards verwenden, müssen Sie dort den Präsentationsstil festlegen. Zumindest hat das bei mir funktioniert.
Julian B.
Ich habe diese drei Zeilen in der init-Methode im dargestellten Ansichts-Controller hinzugefügt und funktioniert wie ein Zauber: self.providesPresentationContextTransitionStyle = YES; self.definesPresentationContext = YES; [self setModalPresentationStyle: UIModalPresentationOverCurrentContext];
Inigo333
2
Unter iOS 8+ musste ich ein Modal von einem UINavigationController präsentieren, sodass mir das Präsentieren von einem Kind nicht das lieferte, was ich brauchte. Stattdessen sourceVCist self.navigationController. Auch nachdem ich den Zielpräsentationsstil als benutzerdefiniert festgelegt hatte, konnte ich ihn durchschauen. [sourceVC setModalPresentationStyle:UIModalPresentationCurrentContext];, [targetVC setModalPresentationStyle:UIModalPresentationCustom];Hoffentlich wird es jemand helfen.
Devdc
Hinweis - Rufen Sie presentedVC.modalPresentationStyle = UIModalPresentationOverCurrentContextden präsentierenden VC an. Funktioniert nicht in der präsentierten VC. Vertrau mir, ich habe es versucht.
Smileham
104

In iOS 8.0 und höher können Sie dazu die Eigenschaft modalPresentationStyle auf UIModalPresentationOverCurrentContext setzen

//Set property **definesPresentationContext** YES to avoid presenting over presenting-viewController's navigation bar

self.definesPresentationContext = YES; //self is presenting view controller
presentedController.view.backgroundColor = [YOUR_COLOR with alpha OR clearColor]
presentedController.modalPresentationStyle = UIModalPresentationOverCurrentContext;

[self presentViewController:presentedController animated:YES completion:nil];

Siehe Bild im Anhang

sat20786
quelle
5
Dies ist die einzige Lösung, die ich zur Arbeit bringen könnte. Sehr einfach auch. Fügen Sie dies einfach Ihrer präsentierenden VC vor dem modalen Übergang hinzu.
Siriss
1
Xcoe 9.2 / iOS 11.2 schnell .customund .overFullScreenfunktioniert.
William Hu
Und wenn Sie .overFullScreendie aktuelle Ansicht einstellen, werden die Controller viewWillAppearnicht aufgerufen.
William Hu
Eine weitere Sache presentedController.view.backgroundColor = #color#sollte in presentedController's geschrieben werden viewDidLoad, sonst wird presentedControllerdas Leben unterbrochen.
DawnSong
44

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];

In diesem Fall verpassen Sie eine Slide-On-Animation. Um die Animation beizubehalten, können Sie weiterhin die folgende "nicht elegante" Erweiterung verwenden:

[presentingVC presentViewController:presentedVC animated:YES completion:^{
    [presentedVC dismissViewControllerAnimated:NO completion:^{
        presentingVC.modalPresentationStyle = UIModalPresentationCurrentContext;
        [presentingVC presentViewController:presentedVC animated:NO completion:NULL];
    }];
}];

Befindet sich unser PresentingV innerhalb von UINavigationController oder UITabbarController, müssen Sie mit diesen Controllern als PresentingVC arbeiten.

Außerdem können Sie in iOS7 benutzerdefinierte Übergangsanimationen implementieren, die ein UIViewControllerTransitioningDelegateProtokoll anwenden . In diesem Fall erhalten Sie natürlich einen transparenten Hintergrund

@interface ModalViewController : UIViewController <UIViewControllerTransitioningDelegate>

Vor dem Präsentieren müssen Sie zunächst festlegen modalPresentationStyle

modalViewController.modalPresentationStyle = UIModalPresentationCustom;

Dann müssen Sie zwei Protokollmethoden implementieren

- (id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source
{
    CustomAnimatedTransitioning *transitioning = [CustomAnimatedTransitioning new];
    transitioning.presenting = YES;
    return transitioning;
}

- (id<UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed
{
    CustomAnimatedTransitioning * transitioning = [CustomAnimatedTransitioning new];
    transitioning.presenting = NO;
    return transitioning;
}

Als letztes müssen Sie Ihren benutzerdefinierten Übergang in der CustomAnimatedTransitioningKlasse definieren

@interface CustomAnimatedTransitioning : NSObject <UIViewControllerAnimatedTransitioning>
@property (nonatomic) BOOL presenting;
@end

@implementation CurrentContextTransitionAnimator

- (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext 
{
    return 0.25;
}

- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext 
{
    UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];

    if (self.presenting) {
        // custom presenting animation
    }
    else {
        // custom dismissing animation
    }
}
Malex
quelle
7
Bestätigt, dass dies funktioniert. HINWEIS : Wenn sich Ihr viewController in einem Navigationscontroller modalPresentationStylebefindet, stellen Sie sicher, dass dieser ebenfalls eingestellt ist!
mxcl
Ich denke, dass es in den meisten Fällen eine gute Idee ist, Ihren Navigationscontroller als Präsentations-VC zu behandeln.
Malex
Ja, mit diesem modalPresentationStyle ist es unmöglich, eine Präsentationsanimation zu erhalten ((
malex
2
@alex Ja, es funktioniert. Entschuldigung: Mein Fehler war, modalPresentationStyle für die präsentierte VC anstelle der prenstingVC auf UIModalPresentationCurrentContext zu setzen.
Tiguero
5
@mxcl Und wenn sich der Navigationscontroller Ihres viewControllers selbst in einem tabBarController befindet, stellen Sie sicher, dass auch sein modalPresentationStyle festgelegt ist;)
Thomas CG de Vilhena
20

Ich hatte ein wenig Probleme mit dem Interface Builder von XCode 7, um den Präsentationsstil wie von @VenuGopalTewari vorgeschlagen festzulegen. In dieser Version scheint es keine zu sein Over Current Contextoder Over Full Screenfür den Übergang Präsentationsmodus. Damit es funktioniert, habe ich den Modus auf Folgendes eingestellt Default:

Geben Sie hier die Bildbeschreibung ein mit Geben Sie hier die Bildbeschreibung ein

Zusätzlich habe ich den Präsentationsmodus des modal präsentierten View Controllers auf Folgendes eingestellt Over Full Screen:

Geben Sie hier die Bildbeschreibung ein

Bastian
quelle
Dies funktionierte für mich, kein Code erforderlich. Ich benutze Xcode 7.2, schnell und das Ziel ist iOS 8.0
LightMan
Das hat auch bei mir funktioniert. +1 für die richtige Antwort. Danke :)
Augustine PA
Beste Antwort hier!
ShinyuX
1
Kein Code = Beste Antwort. Bastian gewinnt dieses Spiel. Bitte alle +1 diese Antwort.
GeneCode
Diese Antwort hat funktioniert. Ich habe mehr als eine Stunde damit verbracht
user578386
18

Erstellen Sie einen Segue für die modale Präsentation und setzen Sie die Presentation-Eigenschaft dieses Segues auf über den aktuellen Kontext. Es funktioniert zu 100%

Geben Sie hier die Bildbeschreibung ein

Venu Gopal Tewari
quelle
3
Ich bewundere die 100% sicher, es hat funktioniert! Der Schlüssel ist, es auf den Segue anzuwenden. Vielen Dank
Badr
Wenn Sie Ihren Segue nicht an eine Schaltfläche angeschlossen haben und diese programmgesteuert aufrufen, stellen Sie sicher, dass Sie eine Kennung festlegen und performSegueWithIdentifier anstelle von presentViewController aufrufen
user3344977
1
Ich habe alle anderen Antworten ausprobiert, aber dies ist die einzige, die in iOS9 für mich funktioniert hat.
Endavid
14

PresentViewController mit transparentem Hintergrund - in iOS 8 und iOS 9

MYViewController *myVC = [self.storyboard   instantiateViewControllerWithIdentifier:@"MYViewController"];
    myVC.providesPresentationContextTransitionStyle = YES;
    myVC.definesPresentationContext = YES;
    [myVC setModalPresentationStyle:UIModalPresentationOverCurrentContext];
    [self.navigationController presentViewController:myVC animated:YES completion:nil];

Stellen Sie in MYViewController die Hintergrundfarbe Schwarz ein und reduzieren Sie die Deckkraft

Ashwini Chougale
quelle
12

Es ist ein bisschen hackig, aber für mich funktioniert dieser Code (iOS 6):

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

[self presentViewController:self.signInViewController animated:YES completion:^{
    [self.signInViewController dismissViewControllerAnimated:NO completion:^{
        appDelegate.window.rootViewController.modalPresentationStyle = UIModalPresentationCurrentContext;
        [self presentViewController:self.signInViewController animated:NO completion:nil];
        appDelegate.window.rootViewController.modalPresentationStyle = UIModalPresentationFullScreen;

    }];
}];

Dieser Code funktioniert auch auf dem iPhone

Mak
quelle
Vielen Dank - genau das habe ich gebraucht - und einen ersten "Hilfe" -Bildschirm über dem Haupt-Home angezeigt. Wunderschönen!
Matt H
1
Heute verbringe ich fast 3 Stunden damit, nach Lösungen zu suchen, die sowohl für iOS7 als auch für iOS8 funktionieren. Angesichts der Tatsache, dass diese Antwort 1,5 Jahre alt ist und ich ECSlidingViewController verwende, ist dies die einzige Lösung, die funktioniert hat! Danke @Mak.
Centurion
Perfekt. Auch wenn Sie sich nicht für die Animation interessieren, funktionieren die 3 Zeilen in der inneren Vervollständigung perfekt. Danke!
RasTheDestroyer
Nach 3 Stunden ohne Erfolg fand dies, Prost, wünschte, ich könnte mehr abstimmen: D
alessioarsuffi
11

Diese Kategorie hat bei mir funktioniert (ios 7, 8 und 9)

H-Datei

@interface UIViewController (navigation)
- (void) presentTransparentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion;
@end

M-Datei

@implementation UIViewController (navigation)
- (void)presentTransparentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion
{
    if(SYSTEM_VERSION_LESS_THAN(@"8.0")) {
        [self presentIOS7TransparentController:viewControllerToPresent withCompletion:completion];

    }else{
        viewControllerToPresent.modalPresentationStyle = UIModalPresentationOverCurrentContext;
         [self presentViewController:viewControllerToPresent animated:YES completion:completion];
    }
}
-(void)presentIOS7TransparentController:(UIViewController *)viewControllerToPresent withCompletion:(void(^)(void))completion
{
    UIViewController *presentingVC = self;
    UIViewController *root = self;
    while (root.parentViewController) {
        root = root.parentViewController;
    }
    UIModalPresentationStyle orginalStyle = root.modalPresentationStyle;
    root.modalPresentationStyle = UIModalPresentationCurrentContext;
    [presentingVC presentViewController:viewControllerToPresent animated:YES completion:^{
        root.modalPresentationStyle = orginalStyle;
    }];
}
@end
Ted
quelle
1
Ich habe alle Antworten überprüft. Aber für mich ist Ihre Antwort perfekte Arbeit. "+1" dafür. @ Ted
g212gs
1
Ich dachte, ich könnte keine Lösung finden. Vielen Dank!
CopperCash
10

Die Lösung für diese Antwort mit Swift wäre wie folgt.

let vc = MyViewController()
vc.view.backgroundColor = UIColor.clear // or whatever color.
vc.modalPresentationStyle = .overCurrentContext
present(vc, animated: true, completion: nil)
Anthony Dito
quelle
9

Wenn Sie Storyboard verwenden, können Sie diesen Schritt ausführen:

  1. Fügen Sie einen View Controller (V2) hinzu und richten Sie die Benutzeroberfläche nach Ihren Wünschen ein
  • UIView hinzufügen - Hintergrund auf Schwarz und Deckkraft auf 0,5 einstellen
  • Fügen Sie eine weitere UIView (2) hinzu, die als Popup dient (Bitte beachten Sie, dass UIView und UIView (2) dieselbe Ebene / Hierarchie haben müssen. Machen Sie die Bildansicht nicht zum untergeordneten Element der Ansicht, da sonst die Deckkraft der Uiview beeinträchtigt wird beeinflussen die UIView (2))
  1. Präsentieren Sie V2 modal

  2. Klicken Sie auf den Übergang. Legen Sie im Attributinspektor die Präsentation als Vollbild fest . Entfernen Sie die Animation, wenn Sie möchten

Storyboard

  1. Wählen Sie V2. Legen Sie im Attributinspektor die Präsentation als Vollbild fest . Überprüfen Definiert Kontext und bietet kontext

Storyboard

  1. Wählen Sie die Hauptansicht Ihrer V2 (bitte Bild überprüfen). Setzen Sie backgroundColor auf Clear Color

Storyboard

dhin
quelle
6

Ich habe diese drei Zeilen in der init-Methode im dargestellten Ansichts-Controller hinzugefügt und funktioniert wie ein Zauber:

self.providesPresentationContextTransitionStyle = YES;
self.definesPresentationContext = YES;
[self setModalPresentationStyle:UIModalPresentationOverCurrentContext];

BEARBEITEN (funktioniert unter iOS 9.3):

self.modalPresentationStyle = UIModalPresentationOverFullScreen;

Gemäß Dokumentation:

UIModalPresentationOverFullScreen Ein Präsentationsstil für Ansichten, bei dem die präsentierte Ansicht den Bildschirm abdeckt. 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.

Verfügbar in iOS 8.0 und höher.

inigo333
quelle
1
Arbeiten unter iOS 10.2.
Josef Rysanek
4

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. Auf dem iPhone getestet.

Geben Sie hier die Bildbeschreibung ein

Containeransicht ab iOS6 verfügbar. Link zum Blogbeitrag darüber.

Mike Glukhov
quelle
3

Ich habe ein Objekt erstellt, das die Darstellung eines so genannten "überlagerten Modals" übernimmt. Dies bedeutet, dass die Ansicht des Hintergrunds beibehalten wird und Sie ein Modal mit transparentem Hintergrund erstellen können.

Es gibt eine einzige einfache Methode, die dies tut:

- (void)presentViewController:(UIViewController *)presentedViewController
       fromViewController:(UIViewController *)presentingViewController
{
    presentedViewController.modalPresentationStyle = UIModalPresentationCustom;
    presentedViewController.transitioningDelegate = self;
    presentedViewController.modalPresentationCapturesStatusBarAppearance = YES;

    [presentedViewController setNeedsStatusBarAppearanceUpdate];

    [presentingViewController presentViewController:presentedViewController
                                       animated:YES
                                     completion:nil];
}

Es ist wichtig, die modalPresentationCapturesStatusBarAppearanceEigenschaft auf YESfestzulegen und die Aktualisierung der Statusleiste zu erzwingen, wenn Ihr dargestellter Ansichts-Controller einen anderen hat preferredStatusBarStyle.

Dieses Objekt sollte eine haben @property (assign, nonatommic) isPresenting

Sie wollen diese Aufgabe auf die erfüllen UIViewControllerAnimatedTransitioningund UIViewControllerTransitioningDelegateProtokolle und die folgenden Methoden implementieren:

- (id)animationControllerForPresentedController:(UIViewController *)presented
                           presentingController:(UIViewController *)presenting
                               sourceController:(UIViewController *)source
{
    self.isPresenting = YES;

    return self;
}

- (id)animationControllerForDismissedController:(UIViewController *)dismissed
{
    self.isPresenting = NO;

    return self;
}

und:

- (NSTimeInterval)transitionDuration:(id)transitionContext
{
    return 0.25;
}

- (void)animateTransition:(id)transitionContext
{
    UIViewController* firstVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController* secondVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    UIView* containerView = [transitionContext containerView];
    UIView* firstView = firstVC.view;
    UIView* secondView = secondVC.view;

    if (self.isPresenting) {
        [containerView addSubview:secondView];
        secondView.frame = (CGRect){
            containerView.frame.origin.x,
            containerView.frame.origin.y + containerView.frame.size.height,
            containerView.frame.size
        };

        firstView.tintAdjustmentMode = UIViewTintAdjustmentModeDimmed;
        [UIView animateWithDuration:0.25 animations:^{
            secondView.frame = containerView.frame;
        } completion:^(BOOL finished) {
            [transitionContext completeTransition:YES];
        }];
        } else {
        [UIView animateWithDuration:0.25 animations:^{
            firstView.frame = (CGRect){
                containerView.frame.origin.x,
                containerView.frame.origin.y + containerView.frame.size.height,
                containerView.frame.size
        };

        } completion:^(BOOL finished) {
            [transitionContext completeTransition:YES];
        }];
    }
}

Dadurch wird eine Animation von unten nach unten ausgeführt, die die standardmäßige modale Animation nachahmt. Sie können sie jedoch beliebig gestalten.

Wichtig ist, dass die Ansicht des präsentierenden View Controllers im Hintergrund bleibt und Sie einen transparenten Effekt erzielen.

Diese Lösung funktioniert für iOS 7+

Pedro Mancheno
quelle
Danke für deine Antwort.
Salman Khakwani
3

Ein sehr einfacher Weg, dies zu tun ( Storyboardszum Beispiel mit), ist:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"SomeStoryboard" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SomeStoryboardViewController"];
// the key for what you're looking to do:
vc.modalPresentationStyle = UIModalPresentationOverCurrentContext;
vc.view.alpha = 0.50f;

[self presentViewController:vc animated:YES completion:^{
    // great success
}];

Dies wird UIViewControllera Storyboardmodal, aber mit einem durchscheinenden Hintergrund dargestellt.

JaredH
quelle
3

Arbeiten für iOS 7-10

if #available(iOS 8.0, *) {
    nextVC.modalPresentationStyle = .OverCurrentContext
    self.presentViewController(nextVC, animated: true, completion: nil)
} else {
    // Fallback on earlier version
    self.modalPresentationStyle = .Custom          
    nextVC.modalTransitionStyle = .CrossDissolve            
    self.presentViewController(nextVC, animated: false, completion: nil)
    }
}
iluvatar_GR
quelle
2

Um all die guten Antworten und Kommentare hier zusammenzufassen und trotzdem eine Animation zu haben, während ViewControllerich zu Ihrem neuen wechsle, habe ich Folgendes getan: (Unterstützt iOS 6 und höher)

Wenn Sie ein UINavigationController\ verwenden, ist UITabBarControllerdies der richtige Weg:

    SomeViewController *vcThatWillBeDisplayed = [self.storyboard instantiateViewControllerWithIdentifier:@"SomeVC"];

    vcThatWillBeDisplayed.view.backgroundColor = [UIColor colorWithRed: 255/255.0 green:255/255.0 blue:255/255.0 alpha:0.50];    

    self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;
    [self presentViewController:presentedVC animated:YES completion:NULL];

Wenn Sie das tun, verlieren Sie Ihre modalTransitionStyleAnimation. Um es zu lösen, können Sie Ihrer SomeViewControllerKlasse ganz einfach Folgendes hinzufügen :

-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [UIView animateWithDuration:0.4 animations:^() {self.view.alpha = 1;}
       completion:^(BOOL finished){}];
}
- (void)viewDidLoad
{
    [super viewDidLoad];
    self.view.alpha = 0;
}
Segev
quelle
2

Natürlich sollten Sie UIModalPresentationCurrentContext festlegen, aber der Ort zum Festlegen von clearColor ist auch sehr wichtig! Sie können den Hintergrund in der viewDidLoad-Funktion nicht festlegen, sondern vor dem Laden der Ansicht wie im Root-View-Controller oder in der Init-Funktion des Controllers, der angezeigt wird!

actionController.view.backgroundColor = [UIColor clearColor];
[self presentViewController:actionController animated:YES completion:nil];

oder

- (instancetype)init {

    self = [super initWithNibName:nil bundle:nil];

    if(self) {
        self.modalPresentationStyle = UIModalPresentationOverCurrentContext;
        [self.view setBackgroundColor:[UIColor clearColor]];
    }

    return self;
}
Santiago
quelle
Dies war der Hinweis, der mir unter allen anderen geholfen hat. Danke für Ihre Hilfe.
Tomasz Nazarenko
1

Wenn Sie Modal Segue verwenden, stellen Sie sicher, dass Sie es als dieses Bild festlegen (Sie können die Animation deaktivieren, wenn Sie möchten).Geben Sie hier die Bildbeschreibung ein

Ahmed
quelle
1

Eine vollständige Methode, die unter iOS 7 und iOS 8 getestet wurde.

@interface UIViewController (MBOverCurrentContextModalPresenting)

/// @warning Some method of viewControllerToPresent will called twice before iOS 8, e.g. viewWillAppear:.
- (void)MBOverCurrentContextPresentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion;

@end

@implementation UIViewController (MBOverCurrentContextModalPresenting)

- (void)MBOverCurrentContextPresentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion {
    UIViewController *presentingVC = self;

    // iOS 8 before
    if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_7_1) {
        UIViewController *root = presentingVC;
        while (root.parentViewController) {
            root = root.parentViewController;
        }

        [presentingVC presentViewController:viewControllerToPresent animated:YES completion:^{
            [viewControllerToPresent dismissViewControllerAnimated:NO completion:^{
                UIModalPresentationStyle orginalStyle = root.modalPresentationStyle;
                if (orginalStyle != UIModalPresentationCurrentContext) {
                    root.modalPresentationStyle = UIModalPresentationCurrentContext;
                }
                [presentingVC presentViewController:viewControllerToPresent animated:NO completion:completion];
                if (orginalStyle != UIModalPresentationCurrentContext) {
                    root.modalPresentationStyle = orginalStyle;
                }
            }];
        }];
        return;
    }

    UIModalPresentationStyle orginalStyle = viewControllerToPresent.modalPresentationStyle;
    if (orginalStyle != UIModalPresentationOverCurrentContext) {
        viewControllerToPresent.modalPresentationStyle = UIModalPresentationOverCurrentContext;
    }
    [presentingVC presentViewController:viewControllerToPresent animated:YES completion:completion];
    if (orginalStyle != UIModalPresentationOverCurrentContext) {
        viewControllerToPresent.modalPresentationStyle = orginalStyle;
    }
}

@end
BB9z
quelle
1

Swift 4.2

guard let someVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "someVC") as? someVC else {
    return
}
someVC.modalPresentationStyle = .overCurrentContext

present(someVC, animated: true, completion: nil)
Aleksey Shevchenko
quelle
0

in appdelegate:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [[_window rootViewController]setModalPresentationStyle:UIModalPresentationCurrentContext];
    return YES;
}

in Ihrer ersten Ansicht Controller, von wo aus Sie die nächste Ansicht laden müssen:

  NextViewController *customvc = [[NextViewController alloc]init];
    [self presentViewController:customvc animated:YES completion:^{

    }];

in Ihrem nextViewController, der transparent hinzugefügt werden soll:

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor clearColor];
    UIView* backView = [[UIView alloc] initWithFrame:self.view.frame];
    backView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.6];
    [self.view insertSubview:backView atIndex:0];
}
Zaraki
quelle
0

Der Anmeldebildschirm ist modal, dh er befindet sich über dem vorherigen Bildschirm. Bisher haben wir unscharfen Hintergrund, aber es verwischt nichts; Es ist nur ein grauer Hintergrund.

Wir müssen unser Modal richtig einstellen.

Bildlink-Ziel

  • Zuerst müssen wir den Ansichtshintergrund des View Controllers in Farbe löschen ändern. Es bedeutet einfach, dass es transparent sein sollte. Standardmäßig ist diese Ansicht weiß.

  • Zweitens müssen wir den Segue auswählen, der zum Anmeldebildschirm führt, und im Attributinspektor die Präsentation auf Über aktuellen Kontext setzen. Diese Option ist nur verfügbar, wenn das automatische Layout und die Größenklassen aktiviert sind.

Bildlink-Ziel

tinkl
quelle
0

Stellen Sie die Navigation modalPresentationStyleauf einUIModalPresentationCustom

und stellen Sie die Hintergrundfarbe Ihres präsentierten View Controllers als klare Farbe ein.


quelle