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
[~ # ~] 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
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];
Für rein visuelle Denker und Storyboard-Fans können Sie also Folgendes tun:
1. View Controller präsentieren
2. Presented View Controller
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)
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.
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)
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.
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.
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.
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.
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];
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:
<UIViewControllerTransitionDelegate>
)<UIViewControllerAnimatedTransitioning>
)Weitere Informationen zu benutzerdefinierten Übergängen finden Sie in diesem Tutorial .
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
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?