Tengo una UIViewController
vista como una subvista / modal encima de otra UIViewController
vista, como que la subvista / modal debe ser transparente y cualquier componente que se agregue a la subvista debe ser visible. El problema es que lo que tengo es que la subvista muestra un fondo negro en lugar de tener clearColor. Estoy tratando de hacer UIView
que el fondo sea un color claro y no negro. ¿Alguien sabe qué tiene de malo? Cualquier sugerencia apreciada.
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];
}
RESUELTO : Solucioné los problemas. Funciona muy bien tanto para iPhone como para iPad. Controlador de vista modal sin fondo negro solo claro Color / transparente. Lo único que necesito es el cambio que sustituye UIModalPresentationFullScreen
a UIModalPresentationCurrentContext
. ¡Qué simple es eso!
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];
AVISO: si está utilizando una modalPresentationStyle
propiedad de navigationController
:
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];
AVISO: La mala noticia es que la solución anterior no funciona en iOS 7. ¡La buena noticia es que solucioné el problema para iOS7! Le pedí ayuda a alguien y esto es lo que dijo:
Al presentar un controlador de vista modalmente, iOS elimina los controladores de vista debajo de la jerarquía de vista durante el tiempo que se presenta. Si bien la vista de su controlador de vista presentado modalmente es transparente, no hay nada debajo, excepto la ventana de la aplicación, que es negra. iOS 7 introdujo un nuevo estilo de presentación modal UIModalPresentationCustom
, que hace que iOS no elimine las vistas debajo del controlador de vista presentado. Sin embargo, para usar este estilo de presentación modal, debe proporcionar su propio delegado de transición para manejar la presentación y descartar las animaciones. Esto se describe en la charla 'Transiciones personalizadas utilizando controladores de vista' de WWDC 2013 https://developer.apple.com/wwdc/videos/?id=218 que también cubre cómo implementar su propio delegado de transición.
Puede ver mi solución para el problema anterior en iOS7: https://github.com/hightech/iOS-7-Custom-ModalViewController-Transitions
fuente
modalViewController.modalPresentationStyle = UIModalPresentationOverCurrentContext;
va a resolver el problema,Respuestas:
iOS8 +
En iOS8 + ahora puede usar el nuevo modalPresentationStyle UIModalPresentationOverCurrentContext para presentar un controlador de vista con un fondo transparente:
fuente
[self presentViewController:modalViewController animated:YES completion:nil];
? (en lugar de targetController)?RESUELTO : Solucioné los problemas. Funciona muy bien tanto para iPhone como para iPad. Controlador de vista modal sin fondo negro solo claro Color / transparente. Lo único que necesito cambiar es que reemplacé UIModalPresentationFullScreen por UIModalPresentationCurrentContext. ¡Qué simple es eso!
FirstViewController.m
AVISO: si está utilizando una propiedad modalPresentationStyle de navigationController:
FirstViewController.m
AVISO: La mala noticia es que la solución anterior no funciona en iOS 7. ¡La buena noticia es que solucioné el problema para iOS7! Le pedí ayuda a alguien y esto es lo que dijo:
Al presentar un controlador de vista modalmente, iOS elimina los controladores de vista debajo de la jerarquía de vista durante el tiempo que se presenta. Si bien la vista de su controlador de vista presentado modalmente es transparente, no hay nada debajo, excepto la ventana de la aplicación, que es negra. iOS 7 introdujo un nuevo estilo de presentación modal, UIModalPresentationCustom, que hace que iOS no elimine las vistas debajo del controlador de vista presentado. Sin embargo, para usar este estilo de presentación modal, debe proporcionar su propio delegado de transición para manejar la presentación y descartar las animaciones. Esto se describe en la charla 'Transiciones personalizadas utilizando controladores de vista' de WWDC 2013 https://developer.apple.com/wwdc/videos/?id=218 que también cubre cómo implementar su propio delegado de transición.
Puede ver mi solución para el problema anterior en iOS7: https://github.com/hightech/iOS-7-Custom-ModalViewController-Transitions
fuente
self.modalPresentationStyle = UIModalPresentationCurrentContext;
lo hizo.self.modalPresentationStyle = UIModalPresentationFullScreen; [self performSegueWithIdentifier:@"CustomSegue" sender:self];
Entonces, para los pensadores puramente visuales y los fanáticos del guión gráfico, puedes hacer:
1. Presentación del controlador de vista
2. Controlador de vista presentado
fuente
Solución Swift 3 y iOS10:
fuente
Esto es de xCode 7 beta 4 usando un control de arrastre segue. Simplemente configure el fondo de su destino para que se borre y configure las propiedades de segue en IB de la siguiente manera (nb. La presentación también puede ser "Sobre pantalla completa"):
fuente
Encontré que la forma más fácil de hacer que funcione en iOS7 e iOS8 es agregar set the presentationStyle a UIModalPresentationOverCurrentContext en el modallyPresentedVC (ViewController que desea presentar modalmente) debido a iOS8:
y UIModalPresentationCurrentContext en presentVC (el controlador que presenta modallyPresented) debido a iOS7:
Porque las cosas se manejan de manera diferente en iOS7 y iOS8. Por supuesto, no tiene que establecer las propiedades de navigationController si no está usando una. Espero que ayude.
fuente
Versión Swift2:
fuente
Otra forma (no es necesario crear una transición personalizada y funciona en iOS 7)
Usando Storyboard:
Cree el controlador de vista infantil con tamaño de libertad, establezca el ancho de vista en 500x500 (por ejemplo) y agregue el siguiente método:
Luego, cree una secuencia modal con la hoja de formulario y pruébela.
fuente
Solución iOS 7 con segue personalizado:
Solución basada en código de alta tecnología.
fuente
Para mí esto funciona:
MMPushNotificationViewController
es el controlador de Vista Transparente y también he creado elMMPushNotificationViewController
color de la vista como color claro. Ahora todo lo que he hecho e hice mi controlador Transparentview.fuente
Para iOS7
Ahora hay una manera de lograr esto usando las transiciones personalizadas de iOS7, de esta manera:
Para crear su transición personalizada, necesita 2 cosas:
<UIViewControllerTransitionDelegate>
)<UIViewControllerAnimatedTransitioning>
)Puede encontrar más información sobre transiciones personalizadas en este tutorial .
fuente
Funciona muy bien en iOS7 y iOS8
fuente
También puede "volver a agregar" la ventana a la vista.
Y de esta manera, la presentación puede ser animada.
fuente
Para iOS 7 y solo mediante el uso de Interface Builder, se puede lograr configurando la Presentación en "Contexto actual" en todos los controladores de vista involucrados en la presentación modal. Incluso para los controladores de navegación.
Por ejemplo, configúrelo en todos estos controladores de vista:
NavController -> RootViewController -> ModalViewController
fuente
No he jugado mucho con Storyboard / Interface Builder, pero lo que me llama la atención es que le estás diciendo a la vista que sea de color claro (es decir, 100% alfa / transparente) y también que sea opaca ( 0% alfa - completamente sólido). Estas dos cosas no parecen encajar. Yo comentaría la
self.view.opaque = YES;
línea y vería si funciona entonces;)Ah, algo más en lo que acabo de pensar: es completamente posible que su controlador de vista TENGA el fondo alfa, pero, por supuesto, el alfa se mostrará a través del color de la ventana base o del controlador de vista raíz del programa, que es por negro predeterminado La capa base de toda su aplicación no puede tener un fondo transparente, ¿transparente para qué? ¿Qué hay detrás? Tiene que haber algo que ver A TRAVÉS de la transparencia. ¿Tiene sentido?
fuente
Simplemente use "self.modalPresentationStyle = UIModalPresentationCurrentContext;", en la vista de presentación
Funcionará bien :)
fuente