效果如图:
代码如下:
- //
- // ViewController.swift
- // TwoSidedView
- //
- // Created by mayl on 2017/12/14.
- // Copyright © 2017年. All rights reserved.
- //
-
- import UIKit
-
- let gBtn = UIButton.init(type: UIButtonType.custom)
- let gImgV4BottomSide = UIImageView.init(image: UIImage.init(named: "bottomSide"))
- let gImgV4TopSide = UIImageView.init(image: UIImage.init(named: "topSide"))
-
- var lBool4ChangeImgV : Bool = false
- class ViewController: UIViewController {
-
- override func viewDidLoad() {
- super.viewDidLoad()
- setUpUI()
- }
-
- func setUpUI() {
-
- view.addSubview(gBtn)
- gBtn.addTarget(self,action: #selector(ViewController.btnDidClick),for: UIControlEvents.touchUpInside)
- gBtn.center = view.center
-
- gBtn.addSubview(gImgV4BottomSide)
- gBtn.layer.transform = CATransform3DMakeRotation(CGFloat(Double.pi),1,0)
-
-
- gBtn.addSubview(gImgV4TopSide)
-
- //按钮大小设置为与图片大小一致
- gBtn.bounds = gImgV4BottomSide.bounds
- }
-
- @objc func btnDidClick() {
- let lAni = CAKeyframeAnimation.init(keyPath: "transform.rotation.y")
- lAni.duration = 1
- lAni.values = [0,Double.pi];
-
- //使得动画结束后,保持动画效果
- lAni.isRemovedOnCompletion = false
- lAni.fillMode = kCAFillModeForwards
-
- lAni.delegate = self;
-
- gBtn.layer.add(lAni,forKey: nil)
- }
- }
-
- extension UIViewController: CAAnimationDelegate{
- public func animationDidStart(_ anim: CAAnimation) {
- let lDur:CFTimeInterval = anim.duration
- DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + lDur * 0.5) {
- gBtn.bringSubview(toFront: lBool4ChangeImgV == false ? gImgV4BottomSide : gImgV4TopSide)
- lBool4ChangeImgV = !lBool4ChangeImgV
- }
- }
- }
素材: