你怎么翻转一个UIView?

时间:2015-01-28 11:23:31

标签: objective-c swift

我试图制作一款类似于棋盘游戏内存的平铺游戏。我希望UiViews的图块在按下时会翻转,图片会显示出来。是否有可能做到这一点?我一直在寻找,但似乎都显示了视图之间转换的方法。

1 个答案:

答案 0 :(得分:1)

您可以使用此类轻松进行动画翻转。

class FlippingView : UIView
{
    var frontView : UIImageView!
    var backView : UIImageView!
    var isAnimating : Bool = false

    override init(frame: CGRect) {
        super.init(frame: frame)
        frontView = UIImageView(frame: CGRectMake(0, 0, frame.size.width, frame.size.height))
        backView = UIImageView(frame: frontView.frame)
        self.addSubview(frontView)
        self.addSubview(backView)
        self.backView.hidden = true

        let tapRecognizer = UITapGestureRecognizer(target: self, action: "flip")
        self.addGestureRecognizer(tapRecognizer)
    }

    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    func flip()
    {
        if isAnimating {
            return
        }
        isAnimating = true
        if (backView.hidden)
        {
            frontView.layer.transform = CATransform3DMakeRotation(0, 0, 0, 0)
            self.backView.layer.transform = CATransform3DMakeRotation(3.14/2, 0, 1, 0)
            self.backView.hidden = false
            UIView.animateKeyframesWithDuration(2, delay: 0, options: nil, animations: {

                UIView.addKeyframeWithRelativeStartTime(0, relativeDuration: 0.5, animations: {
                     self.frontView.layer.transform = CATransform3DMakeRotation(3.14/2, 0, 1, 0)
                })

                UIView.addKeyframeWithRelativeStartTime(0.5, relativeDuration: 0.5, animations: {
                    self.backView.layer.transform = CATransform3DMakeRotation(3.14, 0, 1, 0)
                })
                }, completion: { (finished) -> Void in
                    self.isAnimating = false
                    self.frontView.hidden = true
            })
        }
        else
        {
            backView.layer.transform = CATransform3DMakeRotation(3.14, 0, 1, 0)
            self.frontView.layer.transform = CATransform3DMakeRotation(3.14/2, 0, 1, 0)
            self.frontView.hidden = false
            UIView.animateKeyframesWithDuration(2, delay: 0, options: nil, animations: {

                UIView.addKeyframeWithRelativeStartTime(0, relativeDuration: 0.5, animations: {
                    self.backView.layer.transform = CATransform3DMakeRotation(-3.14/2, 0, 1, 0)
                })

                UIView.addKeyframeWithRelativeStartTime(0.5, relativeDuration: 0.5, animations: {
                    self.frontView.layer.transform = CATransform3DMakeRotation(0, 0, 1, 0)
                })
                }, completion: { (finished) -> Void in
                    self.isAnimating = false
                    self.backView.hidden = true
            })
        }
    }
}

您可以像这样使用

override func viewDidLoad() {

    flippingView = FlippingView(frame: CGRectMake(100, 100, 100, 100))
    flippingView.frontView.image = UIImage(named: "1.png")
    flippingView.backView.image = UIImage(named: "2.png")
    self.view.addSubview(flippingView)
}