He buscado en StackOverflow (y en Internet) una solución a este problema. La pregunta se ha formulado muchas veces, pero como usted nota, nunca respondió lo suficiente. Muchos solutions dan una solución aceptable si no es importante si, por ejemplo, una barra de herramientas inferior también se curva.
Others han proporcionado una solución utilizando UIView
animaciones/CoreAnimation en lugar de UIModalTransitionStylePartialCurl
como un estilo de transición modal; en el peor de los casos, esta es una solución que no está permitida y, en el mejor de los casos, no tiene el mismo efecto que uno obtiene de UIModalTransitionStylePartialCurl
(por ejemplo, la forma del rizo es diferente).
Ninguna de estas soluciones ha proporcionado una respuesta que imita la solución de Apple en la aplicación Mapas (es decir, usando UIModalTransitionStylePartialCurl
pero dejando UIToolbar
sin rizar en la parte inferior de la pantalla).
Continuaré con esta tradición de respuestas incompletas, ya que me pregunta por un UITabBarController
y mi solución no aborda específicamente ese caso. Sin embargo, resuelve el problema que tenía, que consistía en obtener un rizo de media página con una barra de herramientas sin rizar en la parte inferior.
Debe haber una manera más elegante de hacer esto, pero así es como lo logré.
El rootViewController
de mi AppDelegate
es una subclase de UIViewController
, que llamaré a TAContainerViewController
. TAContainerViewController
administra a) el contenido real de la pantalla (el "material que se va a encrespar"), TAContentViewController
, yb) el contenido "detrás" de TAContentViewController
(por ejemplo, configuración), que llamaré al TAUnderCurlViewController
.
Mi instancia de TAContainerViewController
tenía propiedades para TAContentViewController
y TAUnderCurlViewController
. El UIView
que era mi contenido era una subvista de la propiedad TAContentViewController
view
; del mismo modo, lo que el usuario ve debajo del rizo es la propiedad view
del TAUnderCurlViewController
.
En el método de TAContainerViewController
init
que asegúrese de hacer lo siguiente:
_underCurlVC.modalTransitionStyle = UIModalTransitionStylePartialCurl;
Y para rizar el contenido para revelar debajo de la página, he creado una acción que llama a este código:
[self.contentVC presentModalViewController:self.underCurlVC animated:YES];`
donde self
es el TAContainerViewController
, contentVC
es una instancia de TAContentViewController
, y underCurlVC
es una instancia de TAUnderCurlViewController
.
Para descartar la vista, simplemente [self.contentVC dismissModalViewControllerAnimated:YES];
.
Parece que se produce algo extraño con el marco de contentVC
cuando se descarta la vista modal, por lo que reinicio manualmente el marco cuando se descarta la vista modal.
He publicado un proyecto de muestra con más detalles en Github. Esperemos que alguien pueda tomar esto y convertirlo en una solución ligeramente más elegante, o expandirlo para que funcione con UINavigationController
o UITabBarController
. Creo que el truco es sacar los Controladores de Vista de las relaciones bien definidas en las subclases de Cocoa, así que tal vez subclases de esos Controladores de Vista especiales lo hagan.
FYI el método init anterior es sólo un método de conveniencia estática que hace la asignación etc. – danhopwood