2009-05-27 12 views
11

Sto provando a fare qualcosa che non dovrebbe essere così complicato, ma non riesco a capirlo. Ho un UIViewController che visualizza un UITableView. Voglio presentare un menu contestuale quando l'utente preme su una riga. Voglio che questa sia una vista semi-trasparente con etichette e pulsanti. Potrei usare un AlertView, ma voglio il pieno controllo sul formato delle etichette e dei pulsanti e mi piacerebbe usare Interface Builder.Visualizzazione modale iPhone Più piccola è la schermata

Quindi ho creato la mia vista piccola 250x290, impostato l'alpha su .75 e creato un controller di visualizzazione con le prese per gestire i diversi eventi utente.

Ora voglio presentarlo. Se utilizzo currentModalViewController due cose (indesiderate) accadono 1) la vista copre tutto lo schermo (ma la barra di stato). 2) È semitrasparente, ma quello che vedo "dietro" non è la vista genitore ma la vista root dell'applicazione.

Ive ha provato ad aggiungere come una visualizzazione secondaria, ma non succede nulla, in modo da Im non facendo qualcosa di giusto:

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

E 'possibile fare quello che voglio? Grazie in anticipo.

Gonso

+0

Hi Gonso! Sto provando a fare la stessa cosa. Nella tua soluzione finale, hai finito per ridurre la visualizzazione modale popup? (Il tuo post sottostante suggerisce problemi con i genitori in background ancora interattivi). Hai trovato un modo per disabilitare l'interazione tattile con lo schermo genitore mantenendo la visualizzazione modale più piccola (oltre alla trasparenza parziale, l'utente può ancora vedere le informazioni principali attorno ai bordi della sottoview modale)? Il round rect funziona per me, ma sono preoccupato che l'utente tocchi la vista modale e ottenga una risposta inaspettata. Voglio l'unico ritorno possibile per essere pulsanti sulla vista modale. – Cindeselia

risposta

11

Sto codificando una cosa simile. Il mio approccio includono .....

  1. Non usando dismissModalViewControllerAnimated e presentModalViewController: animato.

  2. Progettare una visualizzazione personalizzata di dimensioni complete in IB. Nel suo corpo viewDidLoad message, imposta il colore di sfondo su clearColor, in modo che lo spazio sulla vista non coperto dai controller sia trasparente.

  3. Ho messo un UIImageView sotto i controller della vista mobile. UIImageView contiene un'immagine photoshoped, che ha gli angoli arrotondati e lo sfondo è impostato su trasparente. Questa vista immagine funge da contenitore.

  4. I utilizza CoreAnimation per presentare/chiudere la visualizzazione mobile nello stile di visualizzazione modale: (il 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]; 
    } 
    
+0

lo sfondo sembra nero se si imposta il colore per cancellare –

2

caldamente considerare l'utilizzo di un controller di navigazione per scorrere nella vostra visualizzazione secondaria, invece di sovrapposizione esso. Questo è il modello previsto e qualsiasi piccolo beneficio che potresti pensare di ottenere facendo a modo tuo sarà ampiamente compensato dal principio di (minimo) sorpresa.

Se davvero devi farlo in questo modo, credo che il trucco sia aggiungere la prima vista tabella come sottoview di una vista "tenuta" trasparente mantenuta dal controller della vista. Quindi aggiungi la tua nuova vista secondaria come un'altra sottoview di questo.

+0

Puoi aggiungere una piccola vista sulla vista genitore usando il controller di navigazione? Immagino di progettare una vista completa con i controlli su di essa come una piccola vista e impostare lo sfondo come trasparente? –

+0

Ho la stessa domanda: è possibile un overlay di una vista piccola? Nemmeno io voglio coprire l'intero schermo con uno slide-in, anche se non è lo "scorrevole" che mi disturba ma la copertura completa. Voglio mantenere il genitore parzialmente visibile perché l'utente beneficia della conoscenza di altre opzioni oltre a quella che ha generato la sottoview. Anch'io voglio impostare lo sfondo come trasparente, ma senza attivare l'interazione con lo schermo posteriore mentre la vista modale è attiva. La vista modale avrebbe un pulsante di annullamento, un UIImageView swipable dettagliato (commuta tra le immagini) e un pulsante di conferma. Grazie! – Cindeselia

1

Anche in questo caso, se si vuole veramente fare questo, invece di aggiungere una vista "tenuta" trasparente, poiché questo pop-up è essenzialmente modale, vorrei renderlo una sottoview direttamente dalla finestra.

Si potrebbe desiderare di mettere uno scudo nero trasparente dietro di esso per evitare tocchi sullo sfondo e l'input di messa a fuoco sul popup.

Ma seriamente, prendi in considerazione di scattare un controller nello stack o utilizzare quella vista di avviso. A meno che tu non abbia assunto un designer $$, probabilmente non sembrerà appropriato su iPhone.

3

wangii

Questo è più o meno la soluzione che ho trovato. ho caricare la vista con loadNibNamed e poi basta aggiungere in cima con addSubView, in questo modo:

//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];  
} 

Potrebbe illustrare i punti 3 e 4?

Quello che ho fatto per dare alla vista l'aspetto retto rotondo è metterlo all'interno di un pulsante rect rotondo.

Questo codice consente effettivamente di avere una piccola vista mobile, ma se la vista è più piccola di quella del genitore, l'utente può interagire con la parte visibile del genitore.

Alla fine creo il mio punto di vista con la stessa dimensione, ma ho tenuto il codice per ogni evenienza.

Gonso

+0

È waitView a UIView o a ViewController? Ho provato il tuo codice e mi ha detto che waitView non ha una cornice. Ho preparato anche un pennino, ma non riesco a trasformare lo schermo di un pennino in un UIView, solo un UIViewController! – Cindeselia

1

Quello che ho fatto è stato creare un UIViewController sulla parte superiore del mio controller UINavigation nella mia app delegato e ne ha fatto una proprietà di un oggetto Singleton per comodità:

- (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; 

}

In qualsiasi momento nella mia app, posso quindi chiamare ad es

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]; 

La BaseViewController utilizzato sulla parte superiore appena eredita da UIViewController e imposta una visualizzazione a schermo intero:

//----- 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; 
} 
Problemi correlati