UIViewAnimationOptions.TransitionFlipFromLeft 第二次不显示 UIView

UIViewAnimationOptions.TransitionFlipFromLeft not show UIView second time

我正在尝试翻转两个 UIViews。我尝试以编程方式使用翻转 UIView 并且效果很好。但是当我尝试翻转我在 storyboard 中创建的 UIView 时它不起作用,第一次它翻转 UIView 但第二次它翻转空白 UiViews?任何人都知道我的代码中是否有任何错误?

在这张图片中,左上角 Debug view Hierarchy 图片是动画按钮之前的图片,左下角 Debug view Hierarchy 图片是动画图片之后的图片。

当我第二次为 UIView 设置动画时,它像下图这样翻转。

class ViewController: UIViewController {

    @IBOutlet var container: UIView!
    @IBOutlet var blueSquare : UIView!
    @IBOutlet var redSquare : UIView!

    override func viewDidLoad() {
        super.viewDidLoad()

    }

    @IBAction func animateButtonTapped(sender: AnyObject) {
        // create a 'tuple' (a pair or more of objects assigned to a single variable)
        var views : (frontView: UIView, backView: UIView)

        if ((self.redSquare.superview) != nil) {
            views = (frontView: self.redSquare, backView: self.blueSquare)
        }
        else {
            views = (frontView: self.blueSquare, backView: self.redSquare)
        }

        // set a transition style
        let transitionOptions = UIViewAnimationOptions.TransitionFlipFromLeft

        // with no animation block, and a completion block set to 'nil' this makes a single line of code
        UIView.transitionFromView(views.frontView, toView: views.backView, duration: 1.0, options: transitionOptions, completion: nil)

    }
}

Programmatically That code is perfectly works.

let container = UIView()
let redSquare = UIView()
let blueSquare = UIView()

override func viewDidLoad() {
    super.viewDidLoad()

    // set container frame and add to the screen
    self.container.frame = CGRect(x: 60, y: 60, width: 200, height: 200)
    self.view.addSubview(container)

    // set red square frame up
    // we want the blue square to have the same position as redSquare 
    // so lets just reuse blueSquare.frame
    self.redSquare.frame = CGRect(x: 0, y: 0, width: 200, height: 200)
    self.blueSquare.frame = redSquare.frame

    // set background colors
    self.redSquare.backgroundColor = UIColor.redColor()
    self.blueSquare.backgroundColor = UIColor.blueColor()

    // for now just add the redSquare
    // we'll add blueSquare as part of the transition animation 
    self.container.addSubview(self.redSquare)   
}

@IBAction func animateButtonTapped(sender: AnyObject) {

    // create a 'tuple' (a pair or more of objects assigned to a single variable)
    var views : (frontView: UIView, backView: UIView)

    if((self.redSquare.superview) != nil){
        views = (frontView: self.redSquare, backView: self.blueSquare)
    }
    else {
        views = (frontView: self.blueSquare, backView: self.redSquare)
    }

    // set a transition style
    let transitionOptions = UIViewAnimationOptions.TransitionFlipFromLeft

    // with no animation block, and a completion block set to 'nil' this makes a single line of code  
    UIView.transitionFromView(views.frontView, toView: views.backView, duration: 1.0, options: transitionOptions, completion: nil)

}

UPDATE

var check = true
 @IBAction func animateButtonTapped(sender: AnyObject) {
    // create a 'tuple' (a pair or more of objects assigned to a single variable)
    var views : (frontView: UIView, backView: UIView)

    if (check == true) {

        views = (frontView: self.redSquare, backView: self.blueSquare)
        check = false
    }
    else {
        views = (frontView: self.blueSquare, backView: self.redSquare)
        check = true
    }

    // set a transition style
    let transitionOptions : UIViewAnimationOptions = [UIViewAnimationOptions.TransitionFlipFromLeft, UIViewAnimationOptions.ShowHideTransitionViews]
    // with no animation block, and a completion block set to 'nil' this makes a single line of code
    UIView.transitionFromView(views.frontView, toView: views.backView, duration: 1.0, options: transitionOptions, completion: nil)

}

啊,在情节提要中,我看到您将两个视图都添加到了容器中,但在代码中您只添加了红方块。也许从情节提要中的容器中删除 bluesquare?

transitionFromView 的默认行为是在动画后删除视图。

let transitionOptions: UIViewAnimationOptions = [.TransitionFlipFromLeft, .ShowHideTransitionViews]

来自文档:https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/#//apple_ref/swift/struct/c:@E@UIViewAnimationOptions

  • ShowHideTransitionViews

When present, this key causes views to be hidden or shown (instead of removed or added) when performing a view transition. Both views must already be present in the parent view’s hierarchy when using this key. If this key is not present, the to-view in a transition is added to, and the from-view is removed from, the parent view’s list of subviews.