iOS - 卡片翻转动画

Sco*_*t B 11 animation uiimageview ios swift

我有两个UIImageViews.一个是'Front',另一个是'Back'.我正在尝试实现它,这样当你点击'Back'时它会触发动画并翻转卡片.

动画效果很好.但它动画整页,我不想要.我只想要UIImageView翻转.我看不出我做错了什么.可能是显而易见的事情.

@IBOutlet weak var answerImageViewer: UIImageView?
@IBOutlet weak var backAnswerImageViewer: UIImageView?

override func viewDidLoad() {
    super.viewDidLoad()
    startNewGame()
    retrieveNewQuestion()
    setupBannerMessage()
    customPlayButtons()

    let tapGesture = UITapGestureRecognizer(target: self, action: Selector("tap"))
    tapGesture.numberOfTapsRequired = 1
    backAnswerImageViewer?.addGestureRecognizer(tapGesture)
    backAnswerImageViewer?.userInteractionEnabled = true
}

var showingBack = true

func tap (){
    if showingBack{
       UIView.transitionFromView(self.backAnswerImageViewer!, toView: self.answerImageViewer!, duration: 1, options: UIViewAnimationOptions.TransitionFlipFromRight, completion: nil)

        backAnswerImageViewer?.hidden = true
        answerImageViewer?.hidden = false

        showingBack = false
    }
    else {
        showingBack = true

        UIView.transitionFromView(self.answerImageViewer!, toView: self.backAnswerImageViewer!, duration: 1, options: UIViewAnimationOptions.TransitionFlipFromRight, completion: nil)

        backAnswerImageViewer?.hidden = false
        answerImageViewer?.hidden = true
    }
}
Run Code Online (Sandbox Code Playgroud)

Car*_*Zyl 15

您的问题是您的UIImageViews直接位于"整页"视图中.

transitionFromView 从其superview中删除fromView,并在给定动画的superview上添加toView.因此,它激活了超级视图.

您应该包含一个UIView,它将服务器作为容器并将两个imageView作为子视图.在容器视图上添加您的点按手势.此外,您不应该对imageViews有弱引用,因为一旦完成动画一次,您对后面imageView的引用就会消失.将它们添加到代码而不是故事板中可能更好.无需隐藏imageViews.

以下是一些示例代码:

class MyViewController: UIViewController {

        @IBOutlet weak var containerView: UIView!

        private let backImageView: UIImageView! = UIImageView(image: UIImage(named: "back"))
        private let frontImageView: UIImageView! = UIImageView(image: UIImage(named: "front"))

        private var showingBack = false

        override func viewDidLoad() {
            super.viewDidLoad()

            frontImageView.contentMode = .ScaleAspectFit
            backImageView.contentMode = .ScaleAspectFit

            containerView.addSubview(frontImageView)
            frontImageView.translatesAutoresizingMaskIntoConstraints = false
            frontImageView.spanSuperview()

            let singleTap = UITapGestureRecognizer(target: self, action: #selector(flip))
            singleTap.numberOfTapsRequired = 1
            containerView.addGestureRecognizer(singleTap)
        }

        func flip() {   
            let toView = showingBack ? frontImageView : backImageView
            let fromView = showingBack ? backImageView : frontImageView
            UIView.transitionFromView(fromView, toView: toView, duration: 1, options: .TransitionFlipFromRight, completion: nil)
            toView.translatesAutoresizingMaskIntoConstraints = false
            toView.spanSuperview()
            showingBack = !showingBack
        }   

    }
Run Code Online (Sandbox Code Playgroud)


J. *_*Doe 15

如果你有一个button"卡"作为变量,并且你想将他的图像更改为一个名为"1"的新图像.你所要做的就是:

let image = UIImage(named: "1")
card.setImage(image, for: .normal)
UIView.transition(with: card, duration: 2, options: .transitionFlipFromRight, animations: nil, completion: nil)
Run Code Online (Sandbox Code Playgroud)

  • 这么简单的解决方案.我在即将推出的flashcard应用程序中实现了它.我添加了一个布尔值,以便在翻转之间进行切换."如果isFlipped {UIView.transition(附:flashcardView,持续时间:0.5,选择:.transitionFlipFromRight,动画:无,完成:无)isFlipped = FALSE}否则{UIView.transition(附:flashcardView,持续时间:0.5,推荐. transitionFlipFromLeft,animations:nil,completion:nil)isFlipped = true}" (2认同)

Saj*_*jon 6

此解决方案用于翻转“卡”,使用两个UIImageView(就像您正在使用...),我在UICollectionView中使用它,这当然不是必需的。

class CardCVCell: UICollectionViewCell {
    @IBOutlet weak var cardFrontImageView: UIImageView!
    @IBOutlet weak var cardBackImageView: UIImageView!

    private var flipped: Bool = false {
        didSet {
            cardFrontImageView.visible = flipped
            cardBackImageView.hidden = flipped
        }
    }

    override func awakeFromNib() {
        super.awakeFromNib()
        cardBackImageView.backgroundColor = UIColor.brownColor()
    }

    override func prepareForReuse() {
        super.prepareForReuse()
        cardFrontImageView.image = nil
        flipped = false
    }

    func flipCard(cardModel: Card) {
        let flipped = cardModel.flipped
        let fromView = flipped ? cardFrontImageView : cardBackImageView
        let toView = flipped ? cardBackImageView : cardFrontImageView
        let flipDirection: UIViewAnimationOptions = flipped ? .TransitionFlipFromRight : .TransitionFlipFromLeft
        let options: UIViewAnimationOptions = [flipDirection, .ShowHideTransitionViews]
        UIView.transitionFromView(fromView, toView: toView, duration: 0.6, options: options) {
            finished in
            cardModel.flipped = !flipped
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

该代码取自我的开源项目,该项目向人们介绍了Swift开发,称为SwiftIntro,这是一款内存游戏,可从Instagram获取图像。

请注意,卡片型号必须是类而不是值类型

  • 我的整个UIView都在旋转,而不是UIImageview :( (2认同)