Iphone SDK – Animación de Subvista

Tengo una Vista que tiene un UIWebView, y un OptionsPane (Personalizado UIViewController con vista Personalizada).

Quiero cuando la vista se muestra, para el panel de opciones (que se encuentra en la parte superior de la vista principal) para VOLTEAR en su lugar. Estoy usando el código, y estoy consiguiendo un resultado extraño.

La PRIMERA vez que la vista se muestra, el panel opciones parece ya ser visible… Cuando me golpeó de nuevo en mi navController, y tire hacia arriba la Vista de nuevo, la animación funciona a la perfección.

¿Alguien puede arrojar algo de luz sobre este tema?

- (void)viewDidLoad {
    [super viewDidLoad];
    optionsPane=[[OptionsPaneController alloc] initWithNibName:@"OptionsPane" bundle:nil];
}

- (void)viewWillAppear:(BOOL)animated {

    [optionsPane.view removeFromSuperview];
    [self checkOptionsVisible];
}

-(void)checkOptionsVisible{
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.5]; 
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:[optionsPane view] cache:YES];
    [[self view] addSubview:[optionsPane view]];
    [theWebView setFrame:CGRectMake(0,87,320,230)];
    [[optionsPane view] setFrame:CGRectMake(0,0,320,87)];
    [UIView commitAnimations];      
}
  • Nota para el editor. Por favor, no cambie el texto de la pregunta publicado por el OP, a menos que es de vital importancia a la pregunta. Por la edición de mi texto, que en realidad cambió la pregunta. Mantiene sus etiquetas, revierte el idioma.
InformationsquelleAutor Dutchie432 | 2009-05-29

4 Kommentare

  1. 0

    Si yo entiendo lo que tu explicación, tuve un gran problema similar el otro día.

    Lo que está pasando en la primera carga es que viewDidLoad dispara primero. carga el archivo nib toma un poco más de tiempo del que se necesita para la viewWillAppear a fuego en sí.

    Lo que estamos consiguiendo es una punta de carga después de la viewWillApper ya se han jubilado.

    Sobre cualquier carga después de eso, el viewDidLoad no el fuego, dejando que el viewWillAppear para hacer su leal voltear trabajo.

    ¿Qué hacer?

    En primer lugar, pruebe a cambiar el código para que utilice «viewDidAppear». Que debería ayudar, pero tienes que ver si se ve bien.

    Otra opción (feo, lo sé) es tener una llamada a la checkOptionsVisible en el viewDidLoad demasiado.

    Si no de que ayuda, yo consideraría un temporizador como un hack – si las necesidades lo permitan.

    Espero que te hacen más cerca de resolver el problema.

    • Interesante… moviendo la llamada a la función viewDidAppear hace algunos muy funky efectos, y no es lo que yo estoy tratando de hacer… voy a necesitar para jugar con la opción de temporizador y volver a usted. Gracias!
    • Gracias por comentar a cabo. Estoy mirando adelante a oír lo que funcionó para usted (y probablemente la de trabajar para mí también en el final 🙂 ).
  2. 1

    Hmm, no creo que el viewWillAppear mensaje está llegando envió el primer tiempo. Hay dos cosas que he leído en el SDK. Usted debe llamar a super en el interior de ese mensaje y hay una gran advertencia que se pueden aplicar a su primera vez:

    Advertencia: Si el punto de vista de la pertenencia a un controlador de vista se agrega a una jerarquía directamente, el controlador de vista de no recibir este mensaje. Si usted insertar o añadir una vista a la vista de jerarquía, y tiene una vista controlador, debe de enviar a los asociados de controlador de vista de este mensaje directamente. Error al enviar el controlador de vista de este mensaje, se evitará cualquier asociado de la animación que se muestra.

    Finalmente, me iba a correr a través del depurador y asegúrese de que viewWillAppear mensaje se envía cuando usted piensa que es.

    • Muy interesante… me debe haber olvidado de esa nota. Déjame jugar un poco con ella y hacerle saber lo que la historia es como yo CREO que es que se llama.
    • Es la cocción de la primera vez, muy bien – así como la de todas las épocas sucesivas.
    • lástima, tenía la esperanza de que ayudaría a
  3. 0

    Actualizados para su situación:

    Lugar de tener cuatro puntos de vista:

    1. Una copia de la vista

    2. La Vista principal

    3. La vista trasera (panel de opciones) 100 píxeles

    4. La vista frontal (vista en blanco) 100 píxeles

    Agregar la vista principal hasta el fondo para ver como normal.

    Agregar la vista de frente hasta el fondo para ver dónde le gustaría que el panel opciones que aparecen.

    asegúrese de que la vista frontal y posterior tienen el mismo marco.

    Utilizar el mismo código que a continuación mediante los métodos de voltear la parte delantera y trasera de las vistas.


    Respuesta Original

    Necesita 3 puntos de vista:

    1. Una copia de la vista

    2. La Vista frontal de la

    3. La vista trasera de

    El respaldo de ver solo tiene los otros 2 ya que la vuelta de nuevo y a Continuación tienen el tirón de los métodos. Colocar tanto en backingViewController:

    - (void)displayBack{
    
        //parent controller is an ivar so the sub-view controllers know who their daddy is
        backController.parentController = self;
    
    
        [UIView beginAnimations:nil context:@"flipTransitionToBack"];
        [UIView setAnimationDuration:1.2];
    
        //note self.view IS the backing view
        [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.view cache:YES];
    
        //remove the front view
        [[frontController view] removeFromSuperview];
        //add the back view view
        [self.view addSubview:[backController view]];
        [UIView commitAnimations];
    
        //giving a heads up to the view that is about to come on screen
        [backController viewWillAppear:YES];
    
    }
    
    
    
    - (void)displayFront{
    
        [UIView beginAnimations:nil context:@"flipTransitionToFront"];
        [UIView setAnimationDuration:1.2];
    
        [UIView setAnimationDelegate:self];
    
        //I'm interested in knowing this has happened
        [UIView setAnimationDidStopSelector:@selector(flipAnimationDidEndWithID:finished:context:)];
    
        [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.view cache:YES];
        //remove back view
        [[backController view] removeFromSuperview];
        //add the front view
        [self.view addSubview:[frontController view]];
        [UIView commitAnimations];
    
    }  
    • La diferencia es que yo tengo AMBOS puntos de vista mostrando al mismo tiempo, uno que es de alrededor de 100 píxeles de alto, directamente encima de la otra – y yo no soy de conmutación entre ellos – sólo estoy teniendo la parte superior de la vista de «aparecer» en un invertido manera.
    • hmm… a continuación, sólo hacer un «fake» vista frontal que está en blanco y 100 píxeles de alto. Cambiar entre eso y la opción de panel. Que debería resolver su problema.
    • Voy a tener que probar esto en un proyecto independiente antes de «hacer pedazos» mi código actual para ver si esto funciona. Os mantendré informados.
    • La buena suerte. Para el estímulo, este fragmento absolutamente NO funciona en un proyecto de producción. Si va a trabajar con la subvista, usted encontrará cuando usted la prueba.
    • Im realmente no estoy seguro que se necesita para hacer todo esto… Después de estudiar este código en preparación para aplicarlo este código realmente transiciones entre dos UIViews.. estoy tratando de tener una UIView muestran como un objeto en otro UIView, si… quisiera saber si me estoy perdiendo algo…
  4. 0

    El punto de vista de la propiedad en un UIViewController es perezosamente-carga-incluso cuando usted está init-ción con una punta como la que ustedes están aquí, a la vista de sí mismo no se crea una instancia hasta que la primera vez que se accede a la propiedad.

    Es difícil saber exactamente lo que está pasando sin ver más código, pero usted puede conseguir los resultados que usted desea si usted acceso optionsPane.ver en viewDidLoad (usted no necesita hacer nada con ella, sólo el acceso a la propiedad a la carga de la fuerza).

    • He intentado hacer algo como NSLog(@»%d»,optionsPane.vista.límites.tamaño.altura); inmediatamente después me puse optionsPane=[[optionsPane alloc] init]; estos se llama antes de que el optionsPane vista se agrega como una subvista. Todavía sin éxito. Estoy empezando a preguntarme si debería de chatarra de la animación, realmente no es esencial.
    • Bueno, a lo mucho esa idea… he Aquí una nueva: La única cosa que es diferente la segunda vez es que [optionsPane.ver removeFromSuperview] está haciendo algo. Has probado a añadir el optionsPane.vista a sí mismo.ver en viewDidLoad? Es posible que el no-op removeFromSuperview es de alguna manera la prevención de la animación del sistema de reconocimiento de que el posterior addSubview es animada.
    • Yo creo que previamente se ha intentado que. Yo implementa esa línea de nuevo y no hay ningún cambio visible en absoluto… agradezco sus esfuerzos!
    • error – Implementado*
    • Aquí está una extraña pieza de información. Si, en el viewDidLoad, me la [[optionsPane ver] setFrame:CGRectMake(0,0,0,0)]; – la animación de el cambio de (0,0,0,0) a la (0,0,320,87) especificado en checkOptionsVisible se muestra. Así – ¿por qué tendría QUE animar, y no el ‘problema’ de la animación?
    • Ah, y en la segunda-a través de la cambiar el tamaño de la animación NO mostrar, mientras que el ‘problema’ de la animación hace.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea