Swift 4 的即插即用解决方案。
不要忘记将动画视图放置在某个容器视图中,因为这是实际翻转的视图(因此将其放置在根视图中可能会导致“全页”翻转)。
class ViewController: UIViewController {
private enum Side {
case head
case tail
}
private let containerView = UIView(frame: .zero)
private let firstView = UIView(frame: .zero)
private let secondView = UIView(frame: .zero)
private var currentSide: Side = .head
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(containerView)
containerView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
containerView.heightAnchor.constraint(equalToConstant: 100),
containerView.widthAnchor.constraint(equalToConstant: 100),
containerView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
containerView.centerYAnchor.constraint(equalTo: view.centerYAnchor)
])
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(tapContainer))
containerView.addGestureRecognizer(tapGesture)
containerView.addSubview(firstView)
firstView.translatesAutoresizingMaskIntoConstraints = false
firstView.backgroundColor = .red
NSLayoutConstraint.activate([
firstView.leadingAnchor.constraint(equalTo: containerView.leadingAnchor),
firstView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor),
firstView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor),
firstView.topAnchor.constraint(equalTo: containerView.topAnchor),
])
containerView.addSubview(secondView)
secondView.translatesAutoresizingMaskIntoConstraints = false
secondView.backgroundColor = .yellow
secondView.isHidden = true
NSLayoutConstraint.activate([
secondView.leadingAnchor.constraint(equalTo: containerView.leadingAnchor),
secondView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor),
secondView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor),
secondView.topAnchor.constraint(equalTo: containerView.topAnchor),
])
}
@objc
func tapContainer() {
switch currentSide {
case .head:
UIView.transition(from: firstView,
to: secondView,
duration: 1,
options: [.transitionFlipFromRight, .showHideTransitionViews],
completion: nil)
currentSide = .tail
case .tail:
UIView.transition(from: secondView,
to: firstView,
duration: 1,
options: [.transitionFlipFromLeft, .showHideTransitionViews],
completion: nil)
currentSide = .head
}
}
}