swift筆記(五)

1.下拉刷新

refreshControl = UIRefreshControl()
        
        let otherView = UIView()
        otherView.frame = CGRect(x: 0, y: 0, width: 400, height: 44)
        otherView.backgroundColor = UIColor.purpleColor()
        refreshControl?.addSubview(otherView)
        /*
        1.UIRefreshControl只要拉到一定程度無論是否松手會都觸發(fā)下拉事件
        2.觸發(fā)下拉時(shí)間之后, 菊花不會自動隱藏
        3.想讓菊花消失必須手動調(diào)用endRefreshing()
        4.只要調(diào)用beginRefreshing, 那么菊花就會自動顯示
        5.如果是通過beginRefreshing顯示菊花, 不會觸發(fā)下拉事件
        */
        refreshControl?.addTarget(self, action: Selector("loadMoreData"), forControlEvents: UIControlEvents.ValueChanged)



RefreshView.swift

import UIKit
import SnapKit

class XMGRefreshControl: UIRefreshControl {
    override init() {
        super.init()
        // 1.添加子控件
        addSubview(refreshView)
        // 2.布局子控件
        refreshView.snp_makeConstraints { (make) -> Void in
            make.size.equalTo(CGSize(width: 150, height: 50))
            make.center.equalTo(self)
        }
        
        // 3.監(jiān)聽UIRefreshControl frame改變
        addObserver(self, forKeyPath: "frame", options: NSKeyValueObservingOptions.New, context: nil)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    deinit
    {
        removeObserver(self, forKeyPath: "frame")
    }
    override func endRefreshing() {
        super.endRefreshing()
        refreshView.stopLoadingView()
    }
    
    /// 記錄是否需要旋轉(zhuǎn)
    var rotationFlag = false
    // MARK: - 內(nèi)部控制方法
    override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
        
        if frame.origin.y == 0 || frame.origin.y == -64
        {
            // 過濾掉垃圾數(shù)據(jù)
            return
        }
        
        // 判斷是否觸發(fā)下拉刷新事件
        if refreshing
        {
            // 隱藏提示視圖, 顯示加載視圖, 并且讓菊花轉(zhuǎn)動
            refreshView.startLoadingView()
            return
        }
        
        // 通過觀察發(fā)現(xiàn): 往下拉Y越小, 往上推Y越大
        if frame.origin.y < -50 && !rotationFlag
        {
            rotationFlag = true
            NJLog("往上旋轉(zhuǎn)")
            refreshView.rotationArrow(rotationFlag)
        }else if frame.origin.y > -50 && rotationFlag
        {
            rotationFlag = false
            NJLog("往下旋轉(zhuǎn)")
            refreshView.rotationArrow(rotationFlag)
        }
    }
    
    // MARK: -懶加載
    private lazy var refreshView: RefreshView = RefreshView.refreshView()
}

class RefreshView: UIView {
    /// 菊花
    @IBOutlet weak var loadingImageView: UIImageView!
    /// 提示視圖
    @IBOutlet weak var tipView: UIView!
    /// 箭頭
    @IBOutlet weak var arrowImageView: UIImageView!
    
    class func refreshView() -> RefreshView {
        return NSBundle.mainBundle().loadNibNamed("RefreshView", owner: nil, options: nil).last as! RefreshView
    }
    
    // MARK: - 外部控制方法
    /// 旋轉(zhuǎn)箭頭
    func rotationArrow(flag: Bool)
    {
        var angle: CGFloat = flag ? -0.01 : 0.01
        angle += CGFloat(M_PI)
        /*
        transform旋轉(zhuǎn)動畫默認(rèn)是按照順時(shí)針旋轉(zhuǎn)的
        但是旋轉(zhuǎn)時(shí)還有一個(gè)原則, 就近原則
        */
        UIView.animateWithDuration(2.0) { () -> Void in
            self.arrowImageView.transform = CGAffineTransformRotate(self.arrowImageView.transform, angle)
        }
    }
    
    /// 顯示加載視圖
    func startLoadingView()
    {
        // 0.隱藏提示視圖
        tipView.hidden = true
        
        if let _ = loadingImageView.layer.animationForKey("lnj")
        {
            // 如果已經(jīng)添加過動畫, 就直接返回
            return
        }
        // 1.創(chuàng)建動畫
        let anim =  CABasicAnimation(keyPath: "transform.rotation")
        
        // 2.設(shè)置動畫屬性
        anim.toValue = 2 * M_PI
        anim.duration = 5.0
        anim.repeatCount = MAXFLOAT
        
        // 3.將動畫添加到圖層上
        loadingImageView.layer.addAnimation(anim, forKey: "lnj")
    }
    
    /// 隱藏加載視圖
    func stopLoadingView()
    {
        // 0.顯示提示視圖
        tipView.hidden = false
        
        // 1.移除動畫
        loadingImageView.layer.removeAllAnimations()
    }
}

2.顯示提醒消息

/// 顯示刷新提醒
    private func showRefreshStatus(count: Int)
    {
        // 1.設(shè)置提醒文本
        tipLabel.text = (count == 0) ? "沒有更多數(shù)據(jù)" : "刷新到\(count)條數(shù)據(jù)"
        tipLabel.hidden = false
        // 2.執(zhí)行動畫
        UIView.animateWithDuration(1.0, animations: { () -> Void in
//            UIView.setAnimationRepeatAutoreverses(true)
            self.tipLabel.transform = CGAffineTransformMakeTranslation(0, 44)
            }) { (_) -> Void in
                UIView.animateWithDuration(1.0, delay: 2.0, options: UIViewAnimationOptions(rawValue: 0), animations: { () -> Void in
                    self.tipLabel.transform = CGAffineTransformIdentity
                    }, completion: { (_) -> Void in
                        self.tipLabel.hidden = true
                })
        }
    }

3.緩存行高

 /// 緩存行高
    private var rowHeightCaches =  [String: CGFloat]()

 // 返回行高
    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        
        let viewModel = statuses![indexPath.row]
        let identifier = (viewModel.status.retweeted_status != nil) ? "forwardCell" : "homeCell"
        
        // 1.從緩存中獲取行高
        guard let height = rowHeightCaches[viewModel.status.idstr ?? "-1"] else
        {
            NJLog("計(jì)算行高")
            // 緩存中沒有行高
            // 2.計(jì)算行高
            // 2.1獲取當(dāng)前行對應(yīng)的cell
            let cell = tableView.dequeueReusableCellWithIdentifier(identifier) as! HomeTableViewCell
            
            // 2.1緩存行高
            let  temp = cell.calculateRowHeight(viewModel)
            
            rowHeightCaches[viewModel.status.idstr ?? "-1"] = temp
            
            // 3.返回行高
            return temp
        }
        
        // 緩存中有就直接返回緩存中的高度
        return height
    }


override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // 釋放緩存數(shù)據(jù)
        rowHeightCaches.removeAll()
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市熙掺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件工猜,死亡現(xiàn)場離奇詭異邓线,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)悯蝉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來托慨,“玉大人鼻由,你說我怎么就攤上這事『窨茫” “怎么了蕉世?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長窟感。 經(jīng)常有香客問我讨彼,道長,這世上最難降的妖魔是什么柿祈? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任哈误,我火速辦了婚禮,結(jié)果婚禮上躏嚎,老公的妹妹穿的比我還像新娘蜜自。我一直安慰自己,他們只是感情好卢佣,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布重荠。 她就那樣靜靜地躺著,像睡著了一般虚茶。 火紅的嫁衣襯著肌膚如雪戈鲁。 梳的紋絲不亂的頭發(fā)上仇参,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機(jī)與錄音婆殿,去河邊找鬼诈乒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛婆芦,可吹牛的內(nèi)容都是我干的怕磨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼消约,長吁一口氣:“原來是場噩夢啊……” “哼肠鲫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起或粮,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤导饲,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后氯材,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體帜消,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年浓体,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辈讶。...
    茶點(diǎn)故事閱讀 40,090評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡命浴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出贱除,到底是詐尸還是另有隱情生闲,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布月幌,位于F島的核電站碍讯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏扯躺。R本人自食惡果不足惜捉兴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望录语。 院中可真熱鬧倍啥,春花似錦、人聲如沸澎埠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蒲稳。三九已至氮趋,卻和暖如春伍派,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背剩胁。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工诉植, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人摧冀。 一個(gè)月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓倍踪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親索昂。 傳聞我的和親對象是個(gè)殘疾皇子建车,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評論 2 355

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件椒惨、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,105評論 4 62
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,166評論 25 707
  • 包租爺:邊伯賢(村長) 年齡:28歲 職業(yè):寵物店店主 1號房客:樸燦烈(樸喜慶) 年齡:30歲 職業(yè):漫畫家 2...
    柏洛yeah閱讀 424評論 0 0
  • 最好的溝通效果缤至,是“說的人高興,聽的人開心康谆×斐猓” 在交流過程中,想要賓主盡歡沃暗,最重要的是明確:對方想要聽到什么月洛。 總...
    16118f1f5e2c閱讀 143評論 13 10
  • 偶遇是什么?一種緣分孽锥,一種喜悅嚼黔,一種遐想。世界那么大惜辑,竟然讓我遇到了你唬涧,如此妙不可言,你在心中竊喜盛撑,思緒飛揚(yáng)碎节,該怎...
    徽音閱讀 323評論 0 0