webentwicklung-frage-antwort-db.com.de

Zeigen Sie clearColor UIViewController über UIViewController an

Ich habe eine UIViewController -Ansicht als Unteransicht/Modal über einer anderen UIViewController -Ansicht, so dass die Unteransicht/Modal transparent sein sollte und alle Komponenten, die der Unteransicht hinzugefügt wurden, sichtbar sein sollten. Das Problem ist, dass ich habe, dass die Unteransicht stattdessen schwarzen Hintergrund zeigt, um clearColor zu haben. Ich versuche, UIView als clearColor nicht schwarzen Hintergrund zu machen. Weiß jemand was daran falsch ist? Jeder Vorschlag wird geschätzt.

FirstViewController.m

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];

[vc setModalPresentationStyle:UIModalPresentationFullScreen];
[self presentModalViewController:vc animated:NO];  

SecondViewController.m

- (void)viewDidLoad 
{
     [super viewDidLoad];
     self.view.opaque = YES;
     self.view.backgroundColor = [UIColor clearColor];
}

[~ # ~] behoben [~ # ~] : Ich habe die Probleme behoben. Es funktioniert so gut für iPhone und iPad. Modal View Controller ohne schwarzen Hintergrund nur clearColor/transparent. Das einzige, was ich ändern muss, ist, dass ich UIModalPresentationFullScreen durch UIModalPresentationCurrentContext ersetzt habe. Wie einfach ist das!

FirstViewController.m

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
vc.view.backgroundColor = [UIColor clearColor];
self.modalPresentationStyle = UIModalPresentationCurrentContext;
[self presentViewController:vc animated:NO completion:nil];

HINWEIS: Wenn Sie eine modalPresentationStyle -Eigenschaft von navigationController verwenden:

FirstViewController.m

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
vc.view.backgroundColor = [UIColor clearColor];
self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;
[self presentViewController:vc animated:NO completion:nil];

HINWEIS: Die schlechte Nachricht ist, dass die obige Lösung unter iOS 7 nicht funktioniert. Die gute Nachricht ist, dass ich das Problem für iOS 7 behoben habe! Ich bat jemanden um Hilfe und hier ist, was er sagte:

Wenn ein Ansichtscontroller modal dargestellt wird, werden die darunter liegenden Ansichtscontroller für die Dauer der Darstellung von iOS aus der Ansichtshierarchie entfernt. Während die Ansicht Ihres modal präsentierten Ansichtscontrollers transparent ist, befindet sich nichts darunter außer dem App-Fenster, das schwarz ist. In iOS 7 wurde der neue modale Präsentationsstil UIModalPresentationCustom eingeführt, durch den iOS die Ansichten unter dem präsentierten Ansichtscontroller nicht entfernt. Um diesen modalen Präsentationsstil zu verwenden, müssen Sie jedoch Ihren eigenen Übergangsdelegierten bereitstellen, um die Präsentation zu verwalten und Animationen zu schließen. Dies wird im Vortrag "Benutzerdefinierte Übergänge mit View Controllern" von WWDC 2013 beschrieben https://developer.Apple.com/wwdc/videos/?id=218 , in dem auch die Implementierung eines eigenen Übergangs behandelt wird delegieren.

Sie können meine Lösung für das oben genannte Problem in iOS7 sehen: https://github.com/hightech/iOS-7-Custom-ModalViewController-Transitions

147
hightech

[~ # ~] behoben [~ # ~] : Ich habe die Probleme behoben. Es funktioniert so gut für iPhone und iPad. Modal View Controller ohne schwarzen Hintergrund nur clearColor/transparent. Das Einzige, was ich ändern muss, ist, dass ich UIModalPresentationFullScreen durch UIModalPresentationCurrentContext ersetzt habe. Wie einfach ist das!

FirstViewController.m

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
    vc.view.backgroundColor = [UIColor clearColor];
    self.modalPresentationStyle = UIModalPresentationCurrentContext;
    [self presentViewController:vc animated:NO completion:nil];

HINWEIS: Wenn Sie eine modalPresentationStyle-Eigenschaft von navigationController verwenden:

FirstViewController.m

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
    vc.view.backgroundColor = [UIColor clearColor];
    self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;
    [self presentViewController:vc animated:NO completion:nil];

HINWEIS: Die schlechte Nachricht ist, dass die obige Lösung unter iOS 7 nicht funktioniert. Die gute Nachricht ist, dass ich das Problem für iOS 7 behoben habe! Ich bat jemanden um Hilfe und hier ist, was er sagte:

Wenn ein Ansichtscontroller modal dargestellt wird, werden die darunter liegenden Ansichtscontroller für die Dauer der Darstellung von iOS aus der Ansichtshierarchie entfernt. Während die Ansicht Ihres modal präsentierten Ansichtscontrollers transparent ist, befindet sich nichts darunter außer dem App-Fenster, das schwarz ist. In iOS 7 wurde der neue modale Präsentationsstil UIModalPresentationCustom eingeführt, der dazu führt, dass iOS die Ansichten unter dem präsentierten Ansichtscontroller nicht entfernt. Um diesen modalen Präsentationsstil zu verwenden, müssen Sie jedoch Ihren eigenen Übergangsdelegierten bereitstellen, um die Präsentation zu verwalten und Animationen zu schließen. Dies wird im Vortrag "Benutzerdefinierte Übergänge mit View Controllern" von WWDC 2013 beschrieben https://developer.Apple.com/wwdc/videos/?id=218 , in dem auch die Implementierung eines eigenen Übergangs behandelt wird delegieren.

Sie können meine Lösung für das oben genannte Problem in iOS7 sehen: https://github.com/hightech/iOS-7-Custom-ModalViewController-Transitions

138
hightech

iOS8 +

In iOS8 + können Sie jetzt den neuen modalPresentationStyle UIModalPresentationOverCurrentContext verwenden, um einen Ansichtscontroller mit einem transparenten Hintergrund anzuzeigen:

MyModalViewController *modalViewController = [[MyModalViewController alloc] init];
modalViewController.modalPresentationStyle = UIModalPresentationOverCurrentContext;           
[self presentViewController:modalViewController animated:YES completion:nil];    
142
Brody Robertson

Für rein visuelle Denker und Storyboard-Fans können Sie also Folgendes tun:

1. View Controller präsentieren

Define context

2. Presented View Controller

Presentation: Over Current Context

111
pasevin

Swift 3 & iOS10 Lösung:

//create view controller
let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "RoadTripPreviewViewController")
//remove black screen in background
vc.modalPresentationStyle = .overCurrentContext
//add clear color background
vc.view.backgroundColor = UIColor.clear
//present modal
self.present(vc, animated: true, completion: nil)
21
Kevin ABRIOUX

Dies ist aus xCode 7 Beta 4 mit einem Steuerelement Drag Segue. Stellen Sie einfach den Hintergrund Ihres Ziels zum Löschen ein und legen Sie die Segue-Eigenschaften in IB wie folgt fest (nb. Präsentation kann auch "Über Vollbild" sein):

enter image description here

16
smileBot

Ich fand, der einfachste Weg, um es auf iOS7 und iOS8 zum Laufen zu bringen, ist das Hinzufügen von set the presentationStyle zu UIModalPresentationOverCurrentContext auf der modallyPresentedVC (ViewController, den Sie modal präsentieren möchten) aufgrund von iOS8:

[modallyPresentedVC setModalPresentationStyle:UIModalPresentationOverCurrentContext];
[modallyPresentedVC.navigationController setModalPresentationStyle:UIModalPresentationOverCurrentContext];

und UIModalPresentationCurrentContext bei presentationVC (der Controller, der das modallyPresented präsentiert) wegen iOS7:

[presentingVC setModalPresentationStyle:UIModalPresentationCurrentContext];
[presentingVC.navigationController setModalPresentationStyle:UIModalPresentationCurrentContext];

Weil die Dinge auf iOS7 und iOS8 anders gehandhabt werden. Natürlich müssen Sie die navigationController-Eigenschaften nicht festlegen, wenn Sie keine verwenden. Hoffentlich hilft das.

8
3vangelos

Swift2 Version:

let vc = self.storyboard!.instantiateViewControllerWithIdentifier("YourViewController") as! YourViewController
vc.view.backgroundColor = UIColor.clearColor()
vc.modalPresentationStyle = UIModalPresentationStyle.OverFullScreen // orOverCurrentContext to place under navigation
self.presentViewController(vc, animated: true, completion: nil)
5
Mojtabye

Eine andere Möglichkeit (es muss kein benutzerdefinierter Übergang erstellt werden und es funktioniert unter iOS 7)

Mit Storyboard:

Erstellen Sie den Child View Controller mit der Freiheitsgröße, setzen Sie die Ansichtsbreite beispielsweise auf 500 x 500 und fügen Sie die folgende Methode hinzu:

- (void)viewWillLayoutSubviews{
    [super viewWillLayoutSubviews];
    self.view.superview.bounds = CGRectMake(0, 0, 500, 500);
    self.view.superview.backgroundColor = [UIColor clearColor];
}

Erstellen Sie dann ein Modal-Segue mit Form Sheet und testen Sie es.

4
educaPix

iOS 7-Lösung mit benutzerdefiniertem Segment:

CustomSegue.h
#import <UIKit/UIKit.h>

    @interface CustomSegue : UIStoryboardSegue <UIViewControllerTransitioningDelegate, UIViewControllerAnimatedTransitioning>

    @end



CustomSegue.m
#import "CustomSegue.h"

@implementation CustomSegue

-(void)perform {

    UIViewController* destViewController = (UIViewController*)[self destinationViewController];
    destViewController.view.backgroundColor = [UIColor clearColor];
    [destViewController setTransitioningDelegate:self];
    destViewController.modalPresentationStyle = UIModalPresentationCustom;
    [[self sourceViewController] presentViewController:[self destinationViewController] animated:YES completion:nil];
}


//===================================================================
// - UIViewControllerAnimatedTransitioning
//===================================================================

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

- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext {

    UIView *inView = [transitionContext containerView];
    UIViewController* toVC = (UIViewController*)[transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    UIViewController* fromVC = (UIViewController *)[transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];

    [inView addSubview:toVC.view];

    CGRect screenRect = [[UIScreen mainScreen] bounds];
    [toVC.view setFrame:CGRectMake(0, screenRect.size.height, fromVC.view.frame.size.width, fromVC.view.frame.size.height)];

    [UIView animateWithDuration:0.25f
                     animations:^{

                         [toVC.view setFrame:CGRectMake(0, 0, fromVC.view.frame.size.width, fromVC.view.frame.size.height)];
                     }
                     completion:^(BOOL finished) {
                         [transitionContext completeTransition:YES];
                     }];
}


//===================================================================
// - UIViewControllerTransitioningDelegate
//===================================================================

- (id <UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source {

    return self;
}

- (id <UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed {
    //I will fix it later.
    //    AnimatedTransitioning *controller = [[AnimatedTransitioning alloc]init];
    //    controller.isPresenting = NO;
    //    return controller;
    return nil;
}

- (id <UIViewControllerInteractiveTransitioning>)interactionControllerForPresentation:(id <UIViewControllerAnimatedTransitioning>)animator {
    return nil;
}

- (id <UIViewControllerInteractiveTransitioning>)interactionControllerForDismissal:(id <UIViewControllerAnimatedTransitioning>)animator {
    return nil;
}

@end

Lösung basierend auf Hightech-Code.

4
Max Gribov

Für mich funktioniert das:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil];
    UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"MMPushNotificationViewController"];

    vc.view.backgroundColor = [UIColor clearColor];
    self.modalPresentationStyle = UIModalPresentationCurrentContext;
#ifdef __IPHONE_8_0
    if(IS_OS_8_OR_LATER)
    {
        self.providesPresentationContextTransitionStyle = YES;
        self.definesPresentationContext = YES;
        [vc setModalPresentationStyle:UIModalPresentationOverCurrentContext];
    }
#endif


    [self presentViewController:vc animated:NO completion:nil];

MMPushNotificationViewController ist die Steuerung für transparente Ansichten und ich habe die Ansichtsfarbe für MMPushNotificationViewController als klare Farbe festgelegt. Jetzt habe ich alles erledigt und meinen Transparentviewcontroller gemacht.

3
Manab Kumar Mal

Sie können das Fenster auch erneut zur Ansicht hinzufügen.

OneViewController *vc = [[OneViewController alloc] init];
if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]) {
    [self presentViewController:vc animated:YES completion:nil];
} else {
    [self presentModalViewController:vc animated:YES];
}

[[[UIApplication sharedApplication] keyWindow] insertSubview:self.view atIndex:0];

Auf diese Weise kann das Präsentieren animiert werden.

2
Elf Sundae

Funktioniert hervorragend auf iOS7 und iOS8

UIViewController* vc=[[UIViewController alloc]initWithNibName:@"VC" bundle:nil];

vc.view.alpha=0.7;
[vc setModalPresentationStyle:UIModalPresentationOverCurrentContext];

self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;

[self presentViewController:vc animated:NO completion:nil];
2
hoppus

Für iOS7

Es gibt jetzt eine Möglichkeit, dies mithilfe der benutzerdefinierten iOS7-Ü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, benötigen Sie zwei Dinge:

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

Weitere Informationen zu benutzerdefinierten Übergängen finden Sie in diesem Tutorial .

2
Kirualex

Für iOS 7 und nur mithilfe von Interface Builder kann dies erreicht werden, indem die Präsentation auf allen an der modalen Präsentation beteiligten View Controllern auf "Over Current Context" (Über den aktuellen Kontext) gesetzt wird. Auch für Navigationssteuerungen.

Legen Sie es beispielsweise auf allen folgenden Ansichtscontrollern fest:

NavController -> RootViewController -> ModalViewController

enter image description here

1
David Hernandez

Ich habe nicht viel mit dem Storyboard/Interface-Builder herumgespielt, aber was mir auffällt, ist, dass Sie der Ansicht eine klare Farbe (dh 100% Alpha/Durchsichtig) und eine undurchsichtige Farbe ( 0% Alpha (vollständig fest). Diese beiden Dinge scheinen nicht ineinander zu greifen. Ich würde die self.view.opaque = YES; - Zeile auskommentieren und sehen, ob es dann funktioniert;)

Ah, noch etwas, woran ich gerade gedacht habe - es ist durchaus möglich, dass Ihr Ansichtscontroller den Alpha-Hintergrund hat, aber natürlich wird der Alpha bis zur Farbe des Basisfensters oder des Root-Ansichtscontrollers des Programms durchscheinen, was von ist Standard schwarz. Die Basisebene Ihrer gesamten App kann keinen transparenten Hintergrund haben - transparent für was? Was steckt dahinter Es muss etwas durch die Transparenz zu sehen sein. Ist das sinnvoll?

0
WendiKidd