最終效果圖:
項(xiàng)目地址:github.com/Paganarchitect/facebook_newsFeed.git
第一部分搭建基本UI铡原,用到了UICollectionView和NSLayoutConstraint的知識眷蜈∽萌澹看下這部分完成后:
#1 搭建基本框架忌怎,注冊cell酪夷,設(shè)置collectionView數(shù)據(jù)源和代理
1.刪掉storyboard晚岭,并把刪掉Main Interface里的main坦报。將ViewController改名為FeedController片择,subclass of UICollectionViewController。
2.搭建基本框架信不。需說明的是亡呵,UICollectionViewFlowLayout是UICollectionViewLayout的默認(rèn)形式政己。
3.設(shè)定navigation bar歇由,navigation bar titleText及UICollectionView的顏色沦泌。
--繼續(xù)在AppDelegate.swift里,添加代碼,設(shè)置navigation bar和bar title text的顏色释牺。
--在FeedController.swift里没咙,將bar title text設(shè)置為“Facebook News Feed”祭刚,collectionView的背景顏色設(shè)置為淺灰墙牌。
運(yùn)行一下喜滨,現(xiàn)在status bar的顏色還是黑色虽风。想要把它也變成和navigationbartitle的顏色一樣辜膝,怎么辦?
--在Info.plist里内舟,添加一個property--status bar based on view controller appearance,將這個布爾值設(shè)為No充岛,這意味著application對status bar的設(shè)置高于view controller對status bar的設(shè)置崔梗。運(yùn)行一下蒜魄,status bar的顏色也變成了白色,哈哈旅挤。
4.注冊collectionViewCell
--新建文件命名為FeedCell
--回到FeedViewController.swift中,
5.添加數(shù)據(jù)源和代理方法,并設(shè)置垂直方向的反彈為YES
#2 添加nameLabel和profileImageView
1.添加nameLabel和profileImageView并加約束.需要說明的是translatesAuthoresizingMaskIntoConstraints屬性默認(rèn)是True,這里我們設(shè)置為NO芙贫,不添加隱含constraint磺平,這樣才能讓手動添加的constraint起作用怔檩。
當(dāng)然薛训,也可以添加一個方法乙埃,使得代碼看起來更簡潔锯岖!這個方法有兩個參數(shù)出吹,format和views;先聲明一個字典鸠珠;再對views進(jìn)行遍歷渐排。
運(yùn)行一下驯耻,現(xiàn)在是這樣的
2.填充圖片,拖圖片進(jìn)來,并添加代碼
3.修改label可缚。這里城看,需要解釋以下兩點(diǎn):
--關(guān)于numberOfLines:label默認(rèn)只顯示一行测柠,通過設(shè)置numberOfLines可以改變行數(shù)。但是如果設(shè)置為0谒主,則告訴文本不管占多少行霎肯,都顯示出來榛斯。
--關(guān)于NSAttributedString富文本字符串驮俗。使用場景:設(shè)置文字樣式和設(shè)置段落樣式√赂蹋可以分為NSAttributedString和NSMutableAttributedString兩種工碾。在使用中通過將AttributedString賦值給控件的attributedText屬性來添加文字樣式百姓。有屬性的控件有UILabel、UITextField和UITextView焦读。
#3 添加feedTextView,feedImageView和likeCommentsLabel矗晃,和dividerLineView
1.在FeedController.swift里宴倍,將cell的高度改為450鸵贬;接著阔逼,修改nameLabel的約束嗜浮,與superview的垂直間距為8 points
2.添加feedTextView危融,并加約束
3.添加feedImageView,并加約束吉殃。這里解釋一下masksToBounds屬性蛋勺,它用來防止子元素大小溢出父元素。因?yàn)樯厦嫖覀兊腸ontentMode設(shè)置成的是scaleAspectFill贼陶,所以這里需要將maskToBounds屬性設(shè)置為true每界,防止圖片溢出家卖。
4.添加likeCommentsLabel上荡,dividerLineView酪捡。太簡單逛薇,不細(xì)說。
運(yùn)行一下啤呼,現(xiàn)在是這樣的官扣!
#4 添加button
因?yàn)檫@三個button構(gòu)造基本一樣惕蹄,偷個懶卖陵,起一個與這段代碼功能相對應(yīng)的名字赶促,封裝成一個新的方法挟炬。聲明類的類型方法(Type Methods),在方法的關(guān)鍵字func前加上關(guān)鍵字class谤祖。
注意button的水平約束粥喜,每個button的寬度占superview寬度的1/3额湘。但是VFL不能實(shí)現(xiàn)multiplier怎么辦?可以讓likeButton嗡官,commentButton的寬度是shareButton的寬度衍腥。
運(yùn)行一下婆咸,現(xiàn)在是這樣的:
#5 處理橫屏布局
手動調(diào)用invalidateLayout方法以更新布局對象尚骄,此方法會強(qiáng)制生成新layout倔丈。(需要注意invalidateLayout與reloadData的區(qū)別,在移動起趾,添加或者刪除item的時候训裆,使用invalidateLayout蜀铲,而如果只是datasource中的數(shù)據(jù)有更新记劝,這時需要使用reloadData
第一部分結(jié)束厌丑。