Pregunta

Estoy tratando de hacer algo que no debería ser tan complicado, pero no puedo entenderlo. Tengo un UIViewController mostrando una UITableView. Quiero presentar un menú contextual cuando el usuario pulse en una fila. Quiero que esto sea una vista semi-transparente con etiquetas y botones. Podría usar un AlertView, pero quiero un control total sobre el formato de las etiquetas y los botones y le gustaría usar el Interface Builder.

Así que creé mi pequeña vista 250x290, establecer el alfa de 0,75 y crear un controlador de vista con las salidas de manejar los diferentes eventos de usuario.

Ahora quiero presentarlo. Si uso presentModalViewController dos (deseado) cosas suceden 1) la vista cubre toda la pantalla (pero la barra de estado). 2) Es semitransparente, pero lo que veo "detrás" que no es la vista padre pero la vista aplicaciones de raíz.

He intentado añadir como una vista secundaria, pero no pasa nada, así que no estoy haciendo algo bien:

RestaurantContextVC* modalViewController = [[[RestaurantContextVC alloc] initWithNibName:@"RestaurantContextView" bundle:nil] autorelease];
[self.view addSubview:modalViewController.view];

¿Es posible hacer lo que quiero? Gracias de antemano.

Gonso

¿Fue útil?

Solución

Estoy de codificación algo similar. Mi enfoque incluye .....

  1. No usar dismissModalViewControllerAnimated y presentModalViewController:. Animada

  2. Diseñar una vista de tamaño completo personalizado en IB. En su cuerpo de mensaje viewDidLoad, establecer el color de fondo a clearColor, por lo que el espacio en la vista no cubierto por los controladores son transparentes.

  3. pongo un UIImageView bajo los controladores de la vista flotante. El UIImageView contiene una imagen photoshoped, que tiene las esquinas redondeadas y el fondo es transparente. Esta vista de la imagen sirve como el recipiente.

  4. I utiliza CoreAnimation presentar / desestimar la vista flotando en el estilo de vista modal: (la FloatingViewController.m)

    -  (void)viewDidLoad
    {
        [super viewDidLoad];
        [self.view setBackgroundColor:[UIColor clearColor]];
    
        [UIView beginAnimations:nil context:nil];
        [self.view setFrame:CGRectMake(0, 480, 320, 480)];
    
        [UIView setAnimationDuration:0.75f];
        [self.view setFrame:CGRectMake(0, 0, 320, 480)];
        [UIView commitAnimations];
    }
    

Otros consejos

wangii

Eso es más o menos la solución que encontré. Me carga la vista con loadNibNamed y luego a añadir en la parte superior con addSubview, como esto:

//Show a view on top of current view with a wait indicator. This prevents all user interactions.
-(void) showWaitView{
    NSArray* nibViews =  [[NSBundle mainBundle] loadNibNamed:@"WaitView" owner:self options:nil];
#ifdef __IPHONE_2_1
    waitView = [ nibViews objectAtIndex: 0];
#else
    waitView = [ nibViews objectAtIndex: 1];
#endif          
    CGFloat x = self.view.center.x - (waitView.frame.size.width / 2);
    CGFloat y = self.view.center.y - (waitView.frame.size.height / 2);
    [waitView setFrame:CGRectMake(x,y,waitView.bounds.size.width,waitView.bounds.size.height)];
    [self.view addSubview:waitView];    
}

Podría elaborar sobre los puntos 3 y 4?

Lo que hice para dar el punto de vista del aspecto redondeado rect se puso dentro de un botón redondo rect.

Este código en realidad le permiten tener una pequeña vista flotante, pero si la vista es más pequeño que su padre, el usuario puede interactuar con la parte visible de la matriz.

Al final creo mi punto de vista con el mismo tamaño, pero mantuvo el código por si acaso.

Gonso

Me gustaría considerar seriamente el uso de un controlador de navegación para deslizarse en su subvista en lugar de la superposición de la misma. Este es el modelo esperado y cualquier pequeño beneficio que se puede pensar que obtendrá al hacer que su propio camino será compensado en gran medida por el principio de sorpresa (por lo menos).

Si realmente tiene que hacerlo de esta manera, creo que el truco es añadir la primera vista de tabla como una subvista de un "holding" visión transparente que el controlador de vista mantiene. A continuación, añadir la nueva vista como otra sub subvista de ello.

Una vez más, si realmente quiere hacer esto, en lugar de añadir una vista transparente "explotación", ya que este pop-up es esencialmente modal, que lo haría una subvista directamente de la ventana.

Es posible que desee poner en un escudo negro transparente detrás de él para evitar toques en el fondo y el foco de entrada en la ventana emergente.

Pero en serio, considerar o bien haciendo estallar un controlador en la pila o el uso de ese punto de vista de alerta. A menos que haya contratado a un diseñador $$, es probable que no va a parecer adecuado en el iPhone.

Lo que hice fue crear un UIViewController en la parte superior de mi controlador de UINavigation en mi aplicación delegado y la convirtió en una propiedad de un objeto único para mayor comodidad:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

//--- create root navigation controller
self.window.rootViewController = self.navigationController;

//--- create view controller for popups:
popupViewController = [[BaseViewController alloc] init];
popupViewController.view.backgroundColor = [UIColor clearColor];
popupViewController.view.hidden = true; //for rendering optimisation
[self.window addSubview:popupViewController.view];
[AppState sharedInstance].popupViewController = self.popupViewController;

//--- make all visible:
[self.window makeKeyAndVisible];

return YES;

}

En cualquier punto en mi aplicación, entonces me puedo llamar por ejemplo.

MyViewController * myVC = [[UIViewController alloc] init];
//... set up viewcontroller and its view...
// add the view of the created view controller to the popup view:
[AppState sharedInstance].popupViewController.view.hidden = false;
[[AppState sharedInstance].popupViewController.view addSubview:myVC.view];

El BaseViewController utiliza en la parte superior justo hereda de UIViewController y establece una vista de pantalla completa:

//----- in BaseViewController implementation
- (void)loadView {
   //------- create root view:
   CGRect frame = [[AppState sharedInstance] getScreenFrame]; 
   rootView = [[VCView alloc] initWithFrame:frame];
   rootView.backgroundColor = [UIColor whiteColor];
   self.view = rootView;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top