【Swift 5】手機也能變撲克牌魔術?
這篇應該算是『極短篇』吧,個人其實是滿喜歡魔術的(喜歡被騙?),最近在Youtube上看到一篇牌穿進手機的魔術揭秘,看起來是很久以前的魔術了(把妹招術?),身為魔術師(脫魯?)的我,當然也要來練習一下,不過它這篇手機上的牌是固定的,而個人在這裡做一些改良,主要是利用ProximityMonitor的變化,跟Firebase的RealtimeDatabase來變魔術,讓我們來看看吧。
準備道具
- iPhone手機一支
- 可連上Firebase Console的手機一支
- 未使用過的撲克牌一付
- 想要認識的對象 (心儀的對象?)
- 你的好朋友們 (幫忙作弊?)
事前準備工作
撲克牌的檔案命名
Firebase
- 資料庫長相如下,主要是要取得『Poker』上的值,就是在專案裡面的撲克牌圖片名稱,Firebase的使用方式就不再多說了
程式
取得Firebase資料庫的值
// FIRDatabase.swift
import UIKit
import Firebase
class FIRDatabase: NSObject {
public static let shared = FIRDatabase()
private let database = Database.database().reference()
private override init() { super.init() }
/// 取得所有數據
func allValues(result: @escaping ([String : Any]?) -> Void) {
database.observeSingleEvent(of: .value, with: { (snapshot) in
guard let userDict = snapshot.value as? [String: Any] else { result(nil); return }
result(userDict)
}, withCancel: nil)
}
}
讀取Proximity的變化
// ViewController.swift
import UIKit
class ViewController: UIViewController {
@IBOutlet var pokerImageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
pokerImageView.isHidden = true
UIDevice.current.isProximityMonitoringEnabled = true
NotificationCenter.default.addObserver(self, selector: #selector(show(notification:)), name: UIDevice.proximityStateDidChangeNotification, object: nil)
}
private func showPokerImage(_ image: UIImage?) {
pokerImageView.image = image ?? #imageLiteral(resourceName: "JokerRed")
pokerImageView.isHidden = false
}
@objc private func show(notification: NSNotification) {
let database = FIRDatabase.shared
let Key = "Poker"
database.allValues(result: { (array) in
if let pokerArray = array as? [String: String] {
if let imagename = pokerArray[Key] {
self.showPokerImage(UIImage.init(named: imagename))
}
}
})
}
}
表演過程
- 首先將未使用過的撲克牌給對方看,證明牌都是正常的
- 開始洗牌,然後讓對方抽一張,表演者背對大家,然後讓在場的人看這張抽到的牌是什麼牌
- 接下來就是考驗友情的時刻到了,叫你的好友趕快用手機改firebase資料庫
- 然後表演者就將手機放在桌上,口中說說咒語,見證奇蹟的時刻到了,把手劃過手機的ProximityMonitor,對方抽到的牌就出現在手機上了喲