2010-07-28 10 views
9

Mi piacerebbe che un UIView scivoli dalla parte inferiore dello schermo (e rimanga a metà schermo) come un UIActionSheet. Come posso realizzare questo?Come posso presentare un UIView dalla parte inferiore dello schermo come un UIActionSheet?

UPDATE: Sto usando il seguente codice:

TestView* test = [[TestView alloc] initWithNibName:@"TestView" bundle:nil]; 
[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationDuration:0.4]; 
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn]; 

test.view.center = CGPointMake(160,100); 
//test.view.frame = CGRectMake(0, 0, 160, 210); 
[[[UIApplication sharedApplication] keyWindow] addSubview:test.view]; 

[UIView commitAnimations]; 

La vista sembra animare da un angolo e che appare in un angolo. Come posso farlo scorrere verso l'alto dal basso? Avvicinarsi!

+0

aggiornato post con un codice che dovrebbe aiutare – iwasrobbed

+0

un altro buon esempio: http://github.com/homeyer/CustomUIActionSheet –

risposta

4

Fai ciò che Matt ha fatto qui, ma modifica solo i valori e la direzione. Ho il codice a casa per farlo dal basso se ne hai bisogno in seguito (aggiornerò questo post).

Link: http://cocoawithlove.com/2009/05/intercepting-status-bar-touches-on.html

Inoltre, non dimenticare di togliere il pezzo di codice che sposta la vista principale verso il basso (così invece l'UIView appena schiocca sopra la parte superiore come un ActionSheet)

Aggiornato con codice:

Questo è quello che uso in una delle mie applicazioni per mostrare/nascondere un po ' "opzioni" vista:

- (void)toggleOptions:(BOOL)ViewHidden 
{ 
// this method opens/closes the player options view (which sets repeat interval, repeat & delay on/off) 

if (ViewHidden == NO) 
{ 
    // delay and move view out of superview 
    CGRect optionsFrame = optionsController.view.frame; 

    [UIView beginAnimations:nil context:nil]; 

    optionsFrame.origin.y += optionsFrame.size.height; 
    optionsController.view.frame = optionsFrame; 

    [UIView commitAnimations]; 

    [optionsController.view 
    performSelector:@selector(removeFromSuperview) 
    withObject:nil 
    afterDelay:0.5]; 
    [optionsController 
    performSelector:@selector(release) 
    withObject:nil 
    afterDelay:0.5]; 
    optionsController = nil; 
} 
else 
{ 
    optionsController = [[PlayOptionsViewController alloc] init]; 

    // 
    // Position the options at bottom of screen 
    // 
    CGRect optionsFrame = optionsController.view.frame; 
    optionsFrame.origin.x = 0; 
    optionsFrame.size.width = 320; 
    optionsFrame.origin.y = 423; 

    // 
    // For the animation, move the view up by its own height. 
    // 
    optionsFrame.origin.y += optionsFrame.size.height; 

    optionsController.view.frame = optionsFrame; 
    [window addSubview:optionsController.view]; 

    [UIView beginAnimations:nil context:nil]; 

    optionsFrame.origin.y -= optionsFrame.size.height; 
    optionsController.view.frame = optionsFrame; 

    [UIView commitAnimations]; 
} 
} 
+0

Mi piace la tua soluzione. C'è un modo in cui si impedisce all'utente di interagire con la vista dietro questo popup? –

+0

Un modo semplice sarebbe semplicemente disabilitare l'interazione dell'utente (ad esempio 'someView setUserInteractionEnabled: NO];') di quella vista. Un modo migliore sarebbe mostrare per prima cosa un'altra vista con una sorta di sfumatura semitrasparente con l'interazione dell'utente disabilitata e * quindi * animare la nuova vista. In questo modo ha senso per l'utente che dal momento che l'altra vista è alquanto oscurata, non possono più interagire con essa. Altrimenti potrebbero pensare che qualcosa sia rotto. Pensa a come funziona UIAlertView. Quando hai finito, basta rimuovere entrambe le viste – iwasrobbed

1

Dovrete spostare voi stessi la vista, impostando il suo center o frame. Ti lascio scoprire come metterli a posto. Ma per l'animazione:

// set the view to its initial position here... 

[UIView beginAnimations:nil context:NULL]; 
// move the view into place here... 
[UIView commitAnimations]; 
+0

Grazie per la punta! Ci sono quasi. Ho modificato il mio post per mostrare il mio codice. Non è esattamente scorrevole. –

4

Un modo potrebbe essere quello di utilizzare l'attuale controller di vista modale sul controller della vista:

presentModalViewController:(UIViewController *)modalViewController animated:(BOOL)animated

Per maggiori informazioni un'occhiata al UIViewController documentation.

MODIFICA: Se si desidera una visualizzazione a schermo centrale, è necessario animarla in posizione come ha sottolineato @jtbandes. Suggerisco anche l'aggiunta di qualche caramella al UIView blocco di animazione:

[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationDuration:0.4]; 
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn]; 

myView.center = CGPointMake(x,y); 

[UIView commitAnimations]; 

si può poi passare di nuovo se avete bisogno di andare a schermo intero o respingerlo.

+0

Voglio che si comporti anche come un UIActionSheet, mostrando la visualizzazione a metà schermo. –

+0

Grazie per il suggerimento! Ci sono quasi. Ho modificato il mio post per mostrare il mio codice. Non è esattamente scorrevole. –

+0

Che ne dici di una vista come l'app gratuita?È come una vista del centro notifiche che l'utente può trascinare/scorrere e può anche regolare la distanza in alto o in basso della vista sull'altra vista. – marciokoko

0

Controlla questo post: http://blog.yetanotherjosh.com/post/33685102199/3-ways-to-do-a-vertical-transition-with

Vado con l'approccio della finestra modale.

+1

Nota che [le risposte solo per il collegamento sono scoraggiate] (http://meta.stackoverflow.com/tags/link-only-answers/info), le risposte SO dovrebbero essere punto finale di una ricerca di una soluzione (rispetto a un'altra sosta di riferimento, che tende a diventare obsoleta nel tempo). Si prega di considerare l'aggiunta di una sinossi autonoma qui, mantenendo il collegamento come riferimento. – kleopatra

0

provare questa soluzione .... funziona

#pragma mark - Date Selector View PresentModelView with Transparent ViewController 

- (void) showModal:(UIView*) modalView { 

    CGRect rect=modalView.frame; 
    rect.origin=CGPointMake(0, 0); 
    self.tutorialView.frame=rect; 

    UIWindow *mainWindow = [(AppDelegate *)[UIApplication sharedApplication].delegate window]; 

    CGPoint middleCenter; 


    middleCenter = CGPointMake(modalView.center.x, modalView.center.y); 

    CGSize offSize = [UIScreen mainScreen].bounds.size; 

    CGPoint offScreenCenter = CGPointMake(offSize.width/2.0, offSize.height * 1.5); 
    modalView.center = offScreenCenter; 

    if ([[mainWindow subviews] containsObject:modalView]) { 
     [modalView removeFromSuperview]; 
    } 

    [mainWindow addSubview:modalView]; 

    [mainWindow bringSubviewToFront:modalView]; 
    // Show it with a transition effect 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:0.3]; 
    // animation duration in seconds 
    modalView.center = middleCenter; 
    [UIView commitAnimations]; 

} 

// Use this to slide the semi-modal view back down. 
- (void) hideModal:(UIView*) modalView { 

    CGSize offSize = [UIScreen mainScreen].bounds.size; 
    CGPoint offScreenCenter = CGPointMake(offSize.width/2.0, offSize.height * 1.5); 
    [UIView beginAnimations:nil context:(__bridge void *)(modalView)]; 
    [UIView setAnimationDuration:0.3]; 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationDidStopSelector:@selector(hideModalEnded:finished:context:)]; 
    modalView.center = offScreenCenter; 
    [UIView commitAnimations]; 

} 

- (void) hideModalEnded:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context { 

    UIView *modalView = (__bridge UIView *)context; 
    [modalView removeFromSuperview]; 
} 
+0

La rimozione dell'animazione non funziona correttamente –

Problemi correlati