2012-03-01 9 views

Respuesta

17

La animación que estás buscando es:

[UIView animateWithDuration: 1.0 
       animations:^{ 
        view1.alpha = 0.0; 
        view2.alpha = 1.0; 
       }]; 

Una solución más completa, usando que la animación podría ser:

- (void) replaceView: (UIView *) currentView withView: (UIView *) newView 
{ 
    newView.alpha = 0.0; 
    [self.view addSubview: newView]; 

    [UIView animateWithDuration: 1.0 
        animations:^{ 
         currentView.alpha = 0.0; 
         newView.alpha = 1.0; 
        } 
        completion:^(BOOL finished) { 
         [currentView removeFromSuperview]; 
        }]; 
} 
-1
[UIView beginAnimations: @"cross dissolve" context: NULL]; 
[UIView setAnimationDuration: 1.0f]; 
self.firstView.alpha = 0.0f; 
self.secondView.alpha = 1.0f; 
[UIView commitAnimations]; 
+0

Creo que es mejor no utilizar estos métodos. Los bloques son mucho más elegantes. Como dice la documentación de Apple: Se desaconseja el uso de este método en iOS 4.0 y posterior. – Gabriel

+0

¿Por qué? ¿Qué son bloques? – Dmitry

+0

programación basada en bloques. Vea la respuesta de @Ashley Mills. – Gabriel

16

También puede utilizar UIViewAnimationOptionTransitionCrossDissolve en IOS5 y más tarde ...

[UIView transitionFromView:currentView 
        toView:nextView 
        duration:2 
        options:UIViewAnimationOptionTransitionCrossDissolve 
       completion:^(BOOL finished) { 
        [currentView removeFromSuperview]; 
        }]; 
+0

Gracias! ¿La implementación en iOS 4.3 no estará disponible con este código? – Dmitry

+1

ya lo dije en esto ... Se usará para ios5 y más tarde :) – Aravindhan

1

UIView tiene un método llamado transition(from:to:duration:options:completion:) que tiene la siguiente declaración:

class func transition(from fromView: UIView, to toView: UIView, duration: TimeInterval, options: UIViewAnimationOptions = [], completion: ((Bool) -> Void)? = nil) 

Crea una animación de transición entre las vistas especificadas utilizando los parámetros dados.


Entre los muchos UIViewAnimationOptions parámetros que se pueden pasar a transition(from:to:duration:options:completion:) es transitionCrossDissolve.

transitionCrossDissolve tiene la siguiente declaración:

static var transitionCrossDissolve: UIViewAnimationOptions { get } 

Una transición que se disuelve de una vista a la siguiente.


La siguiente Swift código 3 Zona de juegos muestra cómo para alternar entre dos UIViews con una cruz disolver transición mediante el uso de transition(from:to:duration:options:completion:) y transitionCrossDissolve:

import UIKit 
import PlaygroundSupport 

class ViewController: UIViewController { 

    let firstView: UIView = { 
     let view = UIView(frame: CGRect(x: 50, y: 50, width: 100, height: 100)) 
     view.backgroundColor = .red 
     return view 
    }() 
    let secondView: UIView = { 
     let view = UIView(frame: CGRect(x: 50, y: 50, width: 100, height: 100)) 
     view.backgroundColor = .blue 
     return view 
    }() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     view.backgroundColor = .white 
     view.addSubview(firstView) 

     let tapGesture = UITapGestureRecognizer(target: self, action: #selector(toggle(_:))) 
     view.addGestureRecognizer(tapGesture) 
    } 

    func toggle(_ sender: UITapGestureRecognizer) { 
     let presentedView = view.subviews.first === firstView ? firstView : secondView 
     let presentingView = view.subviews.first !== firstView ? firstView : secondView   
     UIView.transition(from: presentedView, to: presentingView, duration: 1, options: [.transitionCrossDissolve], completion: nil) 
    } 

} 

let controller = ViewController() 
PlaygroundPage.current.liveView = controller 
Cuestiones relacionadas