iOS 仿支付寶銀行卡界面(支持Swift和OC)

一:簡介

在有支付相關(guān)的APP中冒冬,都有對應(yīng)的錢包,雖然現(xiàn)在的支付寶撬码,微信支付很流行,但是都是需要綁定自己的銀行卡版保,那么這個銀行卡的卡包頁面該怎么實(shí)現(xiàn)呢呜笑?在網(wǎng)上找了許久也沒有找到合適的,那就索性自己造輪子彻犁。

為了實(shí)現(xiàn)相應(yīng)的功能叫胁,仿照支付寶的銀行卡卡包開發(fā)出相應(yīng)的頁面,頁面長這個樣子:

bankCard.gif

下面詳細(xì)說明頁面是如何實(shí)現(xiàn)的汞幢,功能簡單實(shí)用驼鹅,如有需求請繼續(xù)閱讀,如不需要勿噴請飄過森篷。

二:說明目錄

  1. 創(chuàng)建錢包視圖容器WalletView

  2. 初始化WalletView并加載錢包頭部視圖walletHeader

  3. 在錢包視圖中重新加載卡片視圖

  4. 在錢包視圖中實(shí)現(xiàn)添加卡片方法

  5. 在錢包視圖中實(shí)現(xiàn)卡片展示和隱藏回調(diào)方法

  6. 創(chuàng)建卡片視圖ColoredCardView繼承于CardView

  7. 在CardView中實(shí)現(xiàn)點(diǎn)擊手勢展示隱藏卡片

  8. 導(dǎo)入項(xiàng)目使用介紹

三:具體實(shí)現(xiàn)

1. 創(chuàng)建錢包視圖容器WalletView

創(chuàng)建繼承UIView的WalletView視圖输钩, 通過調(diào)用contentInset方法來控制top、left仲智、bottom买乃、right四個方向的邊距,代碼如下:

public var contentInset: UIEdgeInsets {
        set {
            scrollView.contentInset = newValue
            calculateLayoutValues()
        }
        get {
            return scrollView.contentInset
        }
    }

創(chuàng)建walletHeader方法钓辆,用來加載錢包的頭部視圖剪验,代碼如下:

@IBOutlet public weak var walletHeader: UIView? {
        willSet {
            if let walletHeader = newValue {
                scrollView.addSubview(walletHeader)
            }
        }
        didSet {
            oldValue?.removeFromSuperview()
            calculateLayoutValues()
        }
    }

2. 初始化WalletView并加載錢包頭部視圖walletHeader

在需要加載錢包的地方初始化WalletView,并自定義頭部視圖walletHeader和卡片視圖前联,Demo 中以ViewController頁面為例功戚,代碼如下:

walletView = WalletView(frame: CGRect(x: 10, y: 0, width: screenw - 20, height: screenh - 20))
self.view.addSubview(walletView)
walletView.walletHeader = walletHeaderView
walletView.useHeaderDistanceForStackedCards = true
walletView.contentInset = UIEdgeInsets(top: 20, left: 0, bottom: 0, right: 0)  

3. 在錢包視圖中重新加載卡片視圖

在錢包視圖中重新加載卡片視圖,在這里為了靈活修改方便使用蛀恩,頁面布局可以自定義疫铜,Demo中模仿支付寶頁面進(jìn)行設(shè)計(jì),在CardView視圖中双谆,主要實(shí)現(xiàn)頁面的交互等功能壳咕,具體的UI實(shí)現(xiàn)在ColoredCardView中實(shí)現(xiàn)并繼承于CardView席揽,下面會詳細(xì)說明,重新加載卡片視圖方法源碼如下:

open func reload(cardViews: [CardView]) {
        
        insert(cardViews: cardViews)
        calculateLayoutValues()   
}
func insert(cardViews: [CardView]) {
        
        self.insertedCardViews = cardViews
        
        if insertedCardViews.count == 1 {
            presentedCardView = insertedCardViews.first
        }
}
public var insertedCardViews = [CardView]()    {
        didSet {
            calculateLayoutValues(shouldLayoutWalletView: false)
        }
}

在ViewController中調(diào)用reload方法代碼如下:

walletView.reload(cardViews: coloredCardViews)

4. 在錢包視圖中實(shí)現(xiàn)添加卡片方法

在展示頁面中我們可以看到谓厘,在頁面的左上角有一個添加按鈕幌羞,這個按鈕的UI布局在頭部視圖中實(shí)現(xiàn),具體的功能是竟稳,添加一個卡片属桦,具體的實(shí)現(xiàn)方法如下:

open func insert(cardView: CardView, animated: Bool = false, presented: Bool = false,  completion: InsertionCompletion? = nil) {
        
        presentedCardView = presented ? cardView : self.presentedCardView
        
        if animated {
            
            let y = scrollView.convert(CGPoint(x: 0, y: frame.maxY), from: self).y
            cardView.frame = CGRect(x: 0, y: y, width: frame.width, height: cardViewHeight)
            cardView.layoutIfNeeded()
            scrollView.insertSubview(cardView, at: 0)
            
            UIView.animateKeyframes(withDuration: WalletView.insertionAnimationSpeed, delay: 0, options: [.beginFromCurrentState, .calculationModeCubic], animations: { [weak self] in
                
                UIView.addKeyframe(withRelativeStartTime: 0.0, relativeDuration: 1.0, animations: {
                    self?.insert(cardViews: [cardView] + (self?.insertedCardViews ?? []))
                    self?.layoutWalletView(placeVisibleCardViews: false)
                })
                
                }, completion: { [weak self] (_) in
                    
                    self?.reload(cardViews: self?.insertedCardViews ?? [])
                    completion?()
                    
            })
            
            
        } else {
            reload(cardViews: [cardView] + insertedCardViews)
            placeVisibleCardViews()
            completion?()
        }
}

在ViewController中按鈕的觸發(fā)事件addCardButtonClick方法中調(diào)用insert方法代碼如下:

@objc func addCardButtonClick(addCardButton:UIButton) {
        walletView.insert(cardView: ColoredCardView(), animated: true, presented: true)
    }

5. 在錢包視圖中實(shí)現(xiàn)卡片展示和隱藏回調(diào)方法

在錢包視圖中實(shí)現(xiàn)卡片展示和隱藏回調(diào)方法,在展示狀態(tài)下他爸,需要隱藏掉添加卡片按鈕聂宾,禁止繼續(xù)添加卡片,并且顯示卡片詳細(xì)設(shè)置內(nèi)容和刪除按鈕诊笤。在隱藏狀態(tài)下系谐,需要恢復(fù)添加卡片按鈕,并且隱藏卡片詳細(xì)設(shè)置內(nèi)容和刪除按鈕讨跟,核心源碼如下:

public var didPresentCardViewBlock: PresentedCardViewDidUpdateBlock?

public var presentedCardView: CardView? {
        
        didSet {
            oldValue?.presented = false
            presentedCardView?.presented = true
            didPresentCardViewBlock?(presentedCardView)
        }
 }

在ViewController中實(shí)現(xiàn)回調(diào)功能纪他,代碼如下:

walletView.didPresentCardViewBlock = { [weak self] (_) in
            self?.showAddCardViewButtonIfNeeded()
}

6. 創(chuàng)建卡片視圖ColoredCardView繼承于CardView

創(chuàng)建卡片視圖ColoredCardView繼承于CardView,這個視圖主要實(shí)現(xiàn)UI界面以及加載內(nèi)容晾匠,定義界面屬性代碼如下:

class ColoredCardView: CardView, UITableViewDataSource, UITableViewDelegate {
    // 銀行l(wèi)ogo
    @objc var cardLogo: UIImageView!
    // 開戶行名稱
    @objc var cardName: UILabel!
    // 卡片類型
    @objc var cardAddress: UILabel!
    // 銀行卡號
    @objc var cardNumber: UILabel!
    // 設(shè)置列表
    @objc var cardTableView: UITableView!
    // 卡片視圖
    @objc var bankCardView: UIView!
    // 刪除按鈕
    @objc var removeCardViewButton: UIButton!
    override init(frame: CGRect) {
        super.init(frame: frame)
        setupSubViews()
    }
}

7. 在CardView中實(shí)現(xiàn)點(diǎn)擊手勢展示隱藏卡片

在Demo中實(shí)現(xiàn)在CardView中點(diǎn)擊除了刪除按鈕外任何位置茶袒,都可以觸發(fā)隱藏卡片的功能,這里是在CardView中添加了手勢來實(shí)現(xiàn)該功能凉馆,代碼如下:

    public let tapGestureRecognizer    = UITapGestureRecognizer()
    public let panGestureRecognizer    = UIPanGestureRecognizer()
    public let longGestureRecognizer   = UILongPressGestureRecognizer()
    
    // MARK: Private methods
    
    func setupGestures() {
        
        tapGestureRecognizer.addTarget(self, action: #selector(CardView.tapped))
        tapGestureRecognizer.delegate = self
        addGestureRecognizer(tapGestureRecognizer)
        
        panGestureRecognizer.addTarget(self, action: #selector(CardView.panned(gestureRecognizer:)))
        panGestureRecognizer.delegate = self
        addGestureRecognizer(panGestureRecognizer)
        
        longGestureRecognizer.addTarget(self, action: #selector(CardView.longPressed(gestureRecognizer:)))
        longGestureRecognizer.delegate = self
        addGestureRecognizer(longGestureRecognizer)  
    }

8. 導(dǎo)入項(xiàng)目使用介紹

最后介紹一下該如何在項(xiàng)目中導(dǎo)入該功能薪寓,下載Demo,將Demo中的FBYBankCard.framework文件和ColoredCardView.swift文件導(dǎo)入項(xiàng)目中,在需要加載的頁面中直接引用即可:

import FBYBankCard
class ViewController: UIViewController {
    @objc var walletView: WalletView!
    override func viewDidLoad() {
        super.viewDidLoad()
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鞭光,隨后出現(xiàn)的幾起案子妆艘,更是在濱河造成了極大的恐慌,老刑警劉巖旷太,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件展懈,死亡現(xiàn)場離奇詭異,居然都是意外死亡供璧,警方通過查閱死者的電腦和手機(jī)存崖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來睡毒,“玉大人来惧,你說我怎么就攤上這事⊙莨耍” “怎么了供搀?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵隅居,是天一觀的道長。 經(jīng)常有香客問我葛虐,道長胎源,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任屿脐,我火速辦了婚禮涕蚤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘的诵。我一直安慰自己万栅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布西疤。 她就那樣靜靜地躺著烦粒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瘪阁。 梳的紋絲不亂的頭發(fā)上撒遣,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機(jī)與錄音管跺,去河邊找鬼义黎。 笑死,一個胖子當(dāng)著我的面吹牛豁跑,可吹牛的內(nèi)容都是我干的廉涕。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼艇拍,長吁一口氣:“原來是場噩夢啊……” “哼狐蜕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起卸夕,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤层释,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后快集,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贡羔,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年个初,在試婚紗的時候發(fā)現(xiàn)自己被綠了乖寒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡院溺,死狀恐怖楣嘁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤逐虚,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布聋溜,位于F島的核電站,受9級特大地震影響痊班,放射性物質(zhì)發(fā)生泄漏勤婚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一涤伐、第九天 我趴在偏房一處隱蔽的房頂上張望馒胆。 院中可真熱鬧,春花似錦凝果、人聲如沸祝迂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽型雳。三九已至,卻和暖如春山害,著一層夾襖步出監(jiān)牢的瞬間纠俭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工浪慌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留冤荆,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓权纤,卻偏偏與公主長得像钓简,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子汹想,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容