2010-07-28 12 views
9

Me gustaría que UIView se deslice hacia arriba desde la parte inferior de la pantalla (y permanezca en la mitad de la pantalla) como un UIActionSheet. ¿Cómo puedo lograr esto?¿Cómo puedo presentar una UIView desde la parte inferior de la pantalla como una UIActionSheet?

ACTUALIZACIÓN: estoy usando el siguiente código:

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 parece estar animando desde la esquina y que aparece en la esquina. ¿Cómo puedo hacer que se deslice hacia arriba desde abajo? ¡Acercándose!

+0

puesto al día con algo de código que debe ayudar – iwasrobbed

+0

otro buen ejemplo: http://github.com/homeyer/CustomUIActionSheet –

Respuesta

4

Haga lo que Matt hizo aquí, pero simplemente cambie los valores y la dirección. Tengo un código en casa para hacer esto desde abajo si lo necesitas más tarde (actualizaré esta publicación).

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

Además, no se olvide de sacar el trozo de código que desplaza la vista principal hacia abajo (lo que en lugar de la UIView apenas hace estallar sobre la parte superior como un ActionSheet)

Actualizado con código:

Esto es lo que yo uso en una de mis aplicaciones para mostrar/ocultar un poco de "opciones" 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

Me gusta su solución. ¿Hay alguna manera de evitar que el usuario interactúe con la vista detrás de esta ventana emergente? –

+0

Una forma simple sería desactivar la interacción del usuario (es decir, '[someView setUserInteractionEnabled: NO];') de esa vista. Una forma mejor sería mostrar primero otra vista con algún tipo de degradado semitransparente con la interacción del usuario desactivada y * luego * animar su nueva vista. De esta forma, tiene sentido para el usuario que, dado que la otra vista está algo atenuada, ya no pueda interactuar con ella. De lo contrario, podrían pensar que algo está roto. Solo piense en cómo lo hace un UIAlertView. Cuando haya terminado con esto, simplemente elimine ambas vistas – iwasrobbed

1

Tendrá que mover la vista usted mismo, estableciendo su center o frame. Dejaré que averigües a qué ponerlos. Sin embargo, para la animación:

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

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

Gracias por la punta! Estoy casi allí. Modifiqué mi publicación para mostrar mi código. No se está deslizando exactamente hacia arriba. –

4

Una forma sería utilizar el controlador de vista modal presentes en el controlador de vista:

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

Para obtener más información echar un vistazo a la UIViewController documentation.

EDIT: Si desea una vista en la mitad de una pantalla, tendrá que animarla a su posición como @jtbandes ha señalado. Sugiero, además de darle un poco de caramelo al bloque de animación UIView:

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

myView.center = CGPointMake(x,y); 

[UIView commitAnimations]; 

entonces puede pasar de nuevo si es necesario ir a pantalla completa o descartarla.

+0

Quiero que se comporte como una UIActionSheet también, mostrando la vista en la pantalla. –

+0

¡Gracias por el consejo! Estoy casi allí. Modifiqué mi publicación para mostrar mi código. No se está deslizando exactamente hacia arriba. –

+0

¿Qué tal una vista como la aplicación FreeUp?Es como una vista del centro de notificaciones que el usuario puede arrastrar/deslizar e incluso puede regular qué tan arriba o hacia abajo se muestra la vista sobre la otra vista. – marciokoko

0

Echa un vistazo a esta publicación: http://blog.yetanotherjosh.com/post/33685102199/3-ways-to-do-a-vertical-transition-with

Voy con el enfoque de ventana modal.

+1

Tenga en cuenta que [se desaconsejan las respuestas solo de enlace] (http://meta.stackoverflow.com/tags/link-only-answers/info), entonces las respuestas deberían ser las punto final de una búsqueda de una solución (frente a otra escala más de referencias, que tienden a quedar obsoletas en el tiempo). Considere agregar una sinopsis independiente aquí, manteniendo el enlace como referencia. – kleopatra

0

Pruebe esta solución .... funciona

#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

Eliminar animación no funciona correctamente –

Cuestiones relacionadas