第五天--微博的展示

前言

公司忙著開放發(fā)功能劲绪,一直都都沒時間來更新,廢話不多卡者。今天主要完成的功能
1蒿囤、微博列表的展示
2、下拉刷新和上拉加載更多
3崇决、點擊查看大圖和長按圖片保存的本地相冊材诽。
首先來來張效果圖

5.gif

1、普通微博界面的UI

我把其分為三部分恒傻,如下圖

1.1脸侥、布局分析
個人信息和微博內(nèi)容為一部分(偷懶沒有自定義view)
圖片展示用CollectView來展示
底部三個按鈕則是用xib拖得的View
布局的話用AutoLayout的第三方SnapKit來進行布局的。
這里就不貼代碼了碌冶。
1.2不等高Cell問題的解決
由于不同的微博內(nèi)容,導致cell的高度不同涝缝,因此需要定義一個方法來獲取cell的高度扑庞。

// MARK:計算cell的高度
func getCellHeight(status:YJStatus) -> CGFloat {
    
    self.status = status
    
    layoutIfNeeded()

    
    return CGRectGetMaxY(bottomToolBar.frame);
}

該方法在cell的返回高度的地方調(diào)用譬重,

 override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    
    let status = statusArry[indexPath.row]

    let height = calCell.getCellHeight(status)

    print("計算高度")
    return height
}

注意:這里的calCell我是懶加載一個專門用來計算cell高度的cell,懶加載的目的是不要重復創(chuàng)建cell罐氨。因為使用下面方法獲取cell計算的高度是有問題的臀规。所以暫時這樣計算高度。

  let cell = tableView.dequeueReusableCellWithIdentifier(reuseID)

2栅隐、數(shù)據(jù)的處理

微博官網(wǎng)文檔的數(shù)據(jù)結(jié)構(gòu)如下(截圖不完整


3C9F9DD7-A130-41F3-92D2-35C6F9D34444.png


從上圖中我們中我們可以看出返回的包含微博對象的數(shù)組塔嬉,微博對象中又包含了User對象。因此我們需要新建兩個對象租悄,將返回的數(shù)據(jù)包裝到兩個對象中谨究,方法使用。

微博對象

class YJStatus: NSObject

用戶對象

class YJUser: NSObject

重寫init方法將字典轉(zhuǎn)為對象

 init(dict: [String:AnyObject]) {
    
    super.init()
    
    setValuesForKeysWithDictionary(dict)
}

這里重寫setValueForKey是為叫user轉(zhuǎn)為對象

override func setValue(value: AnyObject?, forKey key: String) {
    
    
    if key == "user" {
        
        user = YJUser(dict: value as![String:AnyObject])
        return
    }
    super.setValue(value, forKey: key)
}

因為我創(chuàng)建的對象YJStatus沒包含數(shù)據(jù)中所有的key值泣棋,所有需要重寫下面的方法胶哲,防止程序崩潰,注意不需要實現(xiàn)

   //重寫該方法是為不崩潰
override func setValue(value: AnyObject?, forUndefinedKey key: String) {
    
}

有了數(shù)據(jù)后潭辈,剩下就是把數(shù)據(jù)賦值給cell鸯屿,然后更新UI。以前OC中我一般會重寫model的set方法把敢,在該方法中去更新UI寄摆,swift中我的寫法如下,在didSet中賦值修赞,更新UI婶恼,其他和OC中一樣。

 //微博模型
var status:YJStatus?{

    didSet {
    
        //在這里賦值
        sourceLabel.text = status?.source
        
        contentLabel.text  = status?.text
        
        crateTimeLabel.text = status?.created_at
        
        userIconImageView.sd_setImageWithURL(status?.user!.iconURL)
        nickNameLabel.text = status?.user?.name
        
        
        //給縮略圖片賦值
        pictureView.imageURLS = status!.thumbURLs
        
        // 賦值給大圖
        pictureView.largeURLs = status!.largeURLs
        
        //圖片賦值完后計算圖片大小榔组,更新約束
        let size = pictureView.calPictureSize()
        
        print(size)

        self.pictureHeighCons?.constraint.updateOffset(size.height)
        self.pictureWidthCons?.constraint.updateOffset(size.width)
    }
}

這里另外講下微博時間的處理熙尉,因為返回的時間并不是我們想要的格式,我們需要對其處理搓扯,在給時間賦值的didSet方法中進行處理检痰,處理如下

 //微博的創(chuàng)建時間
var created_at: String? {

    didSet {
    
        //在這里處理時間
        //先把時間處理為NSDate
        let formatter = NSDateFormatter()
        
        //設置時間的格式
        formatter.dateFormat = "EEE MMM d HH:mm:ss Z yyyy"
        // 設置時間的區(qū)域
        formatter.locale = NSLocale(localeIdentifier: "en")
        
        // 轉(zhuǎn)化為NSDate
        let cratedDate = formatter.dateFromString(created_at!)
        
        if let realDate = cratedDate {
        
            //在這里與當前時間比較
            //獲取當前日歷
            let currentCalendar = NSCalendar.currentCalendar()
            
            if currentCalendar.isDateInToday(realDate) {
                
                //如果在今天之內(nèi)
                //計算當前時間和系統(tǒng)時間之差
                let interval = Int(NSDate().timeIntervalSinceDate(realDate))
                
                if interval<60 {
                    created_at = "剛剛"
                }
                if interval<60*60 {
                    
                    created_at = "\(interval/60)分鐘前"
                }
                
                created_at = "\(interval/60/60)小時前"
            }
            
            // 2.判斷是否是昨天
            var formatterStr = "HH:mm"
            if currentCalendar.isDateInYesterday(realDate) {
                
                formatterStr = "昨天:" + formatterStr
            }
            else {
            
                //處理一年以內(nèi)
                formatterStr = "MM-dd " + formatterStr
                
                //獲取年份
                let comps = currentCalendar.components(NSCalendarUnit.Year, fromDate: realDate, toDate: NSDate(), options:  NSCalendarOptions(rawValue: 0))
                
                if comps.year >= 1 {
                    
                    formatterStr = "yyyy-" + formatterStr
                }
                
            }
            
            
            //設置格式化
            formatter.dateFormat = formatterStr
            created_at = formatter.stringFromDate(realDate)
            
        }
        
        
    }
}

3、點擊查看大圖的實現(xiàn)

分析:點擊圖片的present一個控制器用來展示大圖锨推,和起對象處于哪一張铅歼,所以點擊的時候需要把大圖的數(shù)組和圖片對應的索引傳遞給首頁的控制。由于View的層級超過了三層换可,我們就不用閉包了椎椰,采用通知的形式。在collectionVIew的點擊事件中發(fā)送通知沾鳄,實現(xiàn)如下:

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
 
    
    print("我是圖片我被點擊拉")

    //在這里發(fā)送通知,info中包含大圖數(shù)組慨飘,和被點擊圖片所在的索引
    let info:[String:AnyObject] = [YJLargeURLSkey:largeURLs!,YJIndexKey:indexPath]
    NSNotificationCenter.defaultCenter().postNotificationName(YJShowPhotoBrowerNotification, object: nil, userInfo: info)
}

在主控制器注冊通知

// 注冊顯示圖片瀏覽器的通知
    NSNotificationCenter.defaultCenter().addObserverForName(YJShowPhotoBrowerNotification, object: nil, queue: nil) { (notice) in
        
        
        if let info = notice.userInfo {
        
            //通知處理
            let photoBrowserVC = YJPhotoBrowseViewController()
            photoBrowserVC.sourceImageURLs = info[YJLargeURLSkey] as?[NSURL]
            photoBrowserVC.clickIndex = (info[YJIndexKey] as! NSIndexPath).row
            
            self.presentViewController(photoBrowserVC, animated: true, completion: nil)
            
        }
        
    }

注意記得移除通知

//MARK: 移除通知
deinit {

NSNotificationCenter.defaultCenter().removeObserver(self)
}

YJPhotoBrowseViewController的實現(xiàn),也是collectinVIew來實現(xiàn)。
定義兩個變量瓤的,一個是圖片數(shù)組休弃,還有就是記錄被點擊圖片的索引

 // 圖片數(shù)組
var sourceImageURLs:[NSURL]?{

    didSet {
    
        collectView.contentSize = CGSizeMake(CGFloat(sourceImageURLs!.count)*UIScreen.mainScreen().bounds.size.width, UIScreen.mainScreen().bounds.size.height)
    }
}

// 點擊圖片的所在索引
var clickIndex:Int? {

    didSet {
    
        topLabel.text = "\(clickIndex! + 1)/\(sourceImageURLs!.count)"
        
        let offSetX = (CGFloat(clickIndex!)*UIScreen.mainScreen().bounds.size.width)
        
        print(offSetX)
        collectView.contentOffset = CGPointMake(offSetX, 0)
    }
}

在圖片的didSet中設置collectionVIew的contensize,在索引didSet中設置contenOffset。

大圖的展示和圖片比較大的顯示進度的圖片處理

var photoURL:NSURL?{

    didSet {
    
        
        // 重置起狀態(tài)
        reset()
        
        // 下載圖片
        SDWebImageManager.sharedManager().downloadWithURL(photoURL, options: SDWebImageOptions.HighPriority, progress:{ (totalSize, receiveSize) in
            
            
            SVProgressHUD.showProgress(Float(receiveSize)/Float(totalSize))
           
            if totalSize ==  receiveSize {
                
                SVProgressHUD.dismiss()
            }
            
        }) { (originImage, _, _, _) in
            
            
            if originImage == nil {
            
                return
            }
            let originWidth = originImage.size.width
            let originHeight = originImage.size.height
            let screenWidth = UIScreen.mainScreen().bounds.size.width
            let screenHeight = UIScreen.mainScreen().bounds.size.height
            let realImageHeight = (originWidth/originHeight)*screenWidth
            
            if realImageHeight<screenHeight {
                 self.photeImageView.frame = CGRectMake(0, (screenHeight - realImageHeight)*0.5, screenWidth , realImageHeight)
            }else {
            
                
                self.photeImageView.frame = CGRectMake(0, 0, screenWidth, originHeight)
                
                self.backScrollView.contentSize = CGSizeMake(screenWidth, realImageHeight)
            }
            
            
            self.photeImageView.image = originImage
        }
       
    }
}

點擊圖片dimiss和長按保存的實現(xiàn)圈膏,給圖片添加分別添加一個tap手勢和長按手勢塔猾,然后通過閉包傳遞事件給YJPhotoBrowseViewController

首先定義兩個閉包

//圖片單擊一閉包
var imageClick:(()->())?

//圖片長按閉包,傳遞需要保存的圖片參數(shù)
var imageLongPress:((saveImage:UIImage)->())?

給圖片添加tap和長按手勢

 //圖片添加一個點擊事件
    let tap = UITapGestureRecognizer.init(target: self, action: "tapClick")
    photeImageView.userInteractionEnabled = true
    photeImageView.addGestureRecognizer(tap)
    
    //給圖片添加一個長按手勢
    let longPressGesture = UILongPressGestureRecognizer.init(target: self, action: "longPressAction:")
    photeImageView.addGestureRecognizer(longPressGesture)

事件方法

 //MARK:點擊事件
func tapClick() {
    
  imageClick?()
}

//MARK:長按點擊事件
func longPressAction(longPressGeture:UILongPressGestureRecognizer){

    
    let clickImageView = longPressGeture.view as! UIImageView
    if longPressGeture.state == .Ended {
        
        //長按收拾結(jié)束哦
        print("長按保存圖片可以嗎")
        imageLongPress?(saveImage:clickImageView.image!)
    }
}

在控制返回cell進行事件處理

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    
    
    let cell = collectView.dequeueReusableCellWithReuseIdentifier(YJPhotoBrowseViewReuseID, forIndexPath: indexPath) as! YJPhotoBrowserCell
    
    cell.backgroundColor = UIColor.yj_randomColor()
    
    cell.photoURL = sourceImageURLs![indexPath.row]
    
    
    // 圖片的點擊事件
    cell.imageClick = {
    
        //dismiss
        self.dismissViewControllerAnimated(true, completion: nil)
    }
    
    // 長按保存圖片的點擊事件
    cell.imageLongPress = {
    
        (saveImage:UIImage)->() in
    
        self.saveImage = saveImage
        //保存圖片到相冊
        let alertView = UIAlertView()

        alertView.message = "保存圖片到相冊?"
        alertView.addButtonWithTitle("取消")
        alertView.addButtonWithTitle("保存")
        alertView.delegate = self
        alertView.show()
        
        
    }
    
    
    return cell
    
}

保存圖片的方法如下

 UIImageWriteToSavedPhotosAlbum(saveImage!, self, "image:didFinishSavingWithError:contextInfo:", nil)

保存的結(jié)果OC中會在該方法中回調(diào)稽坤, - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo;
坑爹的事沒有swift方法函數(shù)丈甸,我們只能直接將OC方法改成swift中的寫法,處理如下尿褪。

 func image(image:(UIImage),didFinishSavingWithError error:(NSError?) ,contextInfo:(AnyObject)){

    if error != nil {
        
        SVProgressHUD.showErrorWithStatus("保存失敗", maskType: SVProgressHUDMaskType.Black)
    }
    else {
    
        SVProgressHUD.showSuccessWithStatus("保存成功", maskType: SVProgressHUDMaskType.Black)
    }
}

還有圖片的縮放睦擂,我是利用了UIScorllView的縮放來實現(xiàn)。

今天就到這里茫多,晚安F沓住!天揖!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末夺欲,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子今膊,更是在濱河造成了極大的恐慌些阅,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,080評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件斑唬,死亡現(xiàn)場離奇詭異市埋,居然都是意外死亡,警方通過查閱死者的電腦和手機恕刘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評論 3 385
  • 文/潘曉璐 我一進店門缤谎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人褐着,你說我怎么就攤上這事坷澡。” “怎么了含蓉?”我有些...
    開封第一講書人閱讀 157,630評論 0 348
  • 文/不壞的土叔 我叫張陵频敛,是天一觀的道長。 經(jīng)常有香客問我馅扣,道長斟赚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,554評論 1 284
  • 正文 為了忘掉前任差油,我火速辦了婚禮拗军,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己发侵,他們只是感情好侈咕,可當我...
    茶點故事閱讀 65,662評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著器紧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪楼眷。 梳的紋絲不亂的頭發(fā)上铲汪,一...
    開封第一講書人閱讀 49,856評論 1 290
  • 那天,我揣著相機與錄音罐柳,去河邊找鬼掌腰。 笑死,一個胖子當著我的面吹牛张吉,可吹牛的內(nèi)容都是我干的齿梁。 我是一名探鬼主播,決...
    沈念sama閱讀 39,014評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼肮蛹,長吁一口氣:“原來是場噩夢啊……” “哼勺择!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起伦忠,我...
    開封第一講書人閱讀 37,752評論 0 268
  • 序言:老撾萬榮一對情侶失蹤省核,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后昆码,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體气忠,經(jīng)...
    沈念sama閱讀 44,212評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,541評論 2 327
  • 正文 我和宋清朗相戀三年赋咽,在試婚紗的時候發(fā)現(xiàn)自己被綠了旧噪。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,687評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡脓匿,死狀恐怖淘钟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情亦镶,我是刑警寧澤日月,帶...
    沈念sama閱讀 34,347評論 4 331
  • 正文 年R本政府宣布,位于F島的核電站缤骨,受9級特大地震影響爱咬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜绊起,卻給世界環(huán)境...
    茶點故事閱讀 39,973評論 3 315
  • 文/蒙蒙 一精拟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦蜂绎、人聲如沸栅表。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽怪瓶。三九已至,卻和暖如春践美,著一層夾襖步出監(jiān)牢的瞬間洗贰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評論 1 266
  • 我被黑心中介騙來泰國打工陨倡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留敛滋,地道東北人。 一個月前我還...
    沈念sama閱讀 46,406評論 2 360
  • 正文 我出身青樓兴革,卻偏偏與公主長得像绎晃,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子杂曲,可洞房花燭夜當晚...
    茶點故事閱讀 43,576評論 2 349

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