11.30日更新绪杏,實(shí)現(xiàn)了簡(jiǎn)單的微信朋友圈,點(diǎn)贊矫钓,評(píng)論,圖片舍杜,高度自適應(yīng)新娜,下拉展開(kāi)等各種效果Demo
11.10更新
這種高度自適應(yīng)的Label切記一定要加上這個(gè)屬性
preferredMaxLayoutWidth
不然你會(huì)死的很難看
11.4日更新 ?用這個(gè)庫(kù)實(shí)現(xiàn)了類(lèi)似微信朋友圈的簡(jiǎn)單排版點(diǎn)擊打開(kāi)鏈接
這里我沒(méi)這么考慮性能,只是簡(jiǎn)單先做了這個(gè)功能蝴簇,tableViewcell里面嵌套了collectionView來(lái)進(jìn)行圖片的布局,效果如下匆帚,咱們先不考慮性能熬词,這種情況下切記不能調(diào)用帶有緩存的方法cacheByIndex的方法,由于內(nèi)部是動(dòng)態(tài)的,一定要用(只能犧牲性能了)
[objc]view plaincopy
return[tableViewfd_heightForCellWithIdentifier:identifyconfiguration:^(ConsultDetailTableViewCell*cell)?{
[selfconfigCell:cellindexpath:indexPath];
}];
UITableView里面的Cell固定高度那是基本不可能了互拾,很多功能和界面都會(huì)涉及到高度自適應(yīng)歪今,而且電商類(lèi)的尤其普遍,之前都是自己算啊算颜矿,代碼寫(xiě)的非常多寄猩,邏輯還沒(méi)寫(xiě),光這布局UI和高度計(jì)算都能接近1000了骑疆,寫(xiě)完之后關(guān)鍵出點(diǎn)Bug整個(gè)人都不好了
當(dāng)時(shí)的是這樣的:
突然在github上看到UITableView+FDTemplateLayoutCell這個(gè)庫(kù)
傳送門(mén):點(diǎn)擊打開(kāi)鏈接
剛看到的時(shí)候是這樣的:
能 ?用 ? 么 田篇??箍铭? 真 ?的 ?這 ?么 叼 泊柬??诈火?
第一次用的時(shí)候是這樣的:
哥們兽赁,你是在逗我么,這什么鬼冷守,從來(lái)沒(méi)見(jiàn)過(guò)這樣的場(chǎng)面刀崖,當(dāng)時(shí)我就懵逼了。拍摇。亮钦。。授翻。或悲。
用了幾次之后就出效果了,是這樣的:
哎呦堪唐,不錯(cuò)呦巡语。。淮菠。男公。。合陵。感覺(jué)真的有點(diǎn)叼啊
OK 看下基本流程
由于咱們還是用IB來(lái)布局枢赔,操作NSConstraintLayout類(lèi)來(lái)進(jìn)行計(jì)算,所以先把官網(wǎng)上給出的布局案例貼出來(lái)拥知,如下
注:
a fullyself-satisfiedcell is constrainted by auto layout and each edge("top", "left", "bottom", "right") has at least one layout constraint against it
一個(gè)自適應(yīng)高度的cell用Autolayout來(lái)進(jìn)行約束踏拜,內(nèi)部所有控件的約束整合起來(lái),距離Cell四個(gè)邊的(top left bottom right)至少要各出現(xiàn)一次低剔,不然就是bad one
如下圖所示:
箭頭所指的方向必須出現(xiàn)至少一次才是一套完整的約束
1.首先新建個(gè)工程速梗,造一個(gè)TableView出來(lái)肮塞,設(shè)置好代理,布局好基本框架
2.然后弄一個(gè)Cell姻锁,布局玩之后把關(guān)鍵箭頭所指的兩個(gè)約束拖出來(lái)枕赵,以后要用,先看下主要布局位隶,Demo最后給
3.我自己找了幾個(gè)數(shù)據(jù)源出來(lái)拷窜,我個(gè)人遇到的是,如果每個(gè)cell有圖片涧黄,或者沒(méi)圖片篮昧,而且圖片的高度不等,那么服務(wù)器也要求返回具體的圖片寬和高弓熏,利于我們直接拿來(lái)進(jìn)行等比例計(jì)算恋谭,然后在下面這個(gè)代理方法布局的時(shí)候進(jìn)行操作
[objc]view plaincopy
-(UITableViewCell*)tableView:(UITableView*)tableViewcellForRowAtIndexPath:(NSIndexPath*)indexPath
{
MKJTableViewCell*cell?=?[tableViewdequeueReusableCellWithIdentifier:identifyforIndexPath:indexPath];
[selfconfigCell:cellindexpath:indexPath];//!<?該方法等下也會(huì)用到
returncell;
}
[objc]view plaincopy
最關(guān)鍵的方法
[objc]view plaincopy
-?(void)configCell:(MKJTableViewCell*)cellindexpath:(NSIndexPath*)index
{
//?獲取模型
MKJModel*model?=self.dataSource[index.row];
__weak?typeof(cell)?weakCell?=?cell;
//?配置用戶頭像的的圖片,以下操作是讓圖片0-1的漸現(xiàn)的動(dòng)畫(huà)
[cell.headImageViewsd_setImageWithURL:[NSURLURLWithString:model.headImageURL]completed:^(UIImage*image,NSError*error,?SDImageCacheType?cacheType,NSURL*imageURL)?{
if(image?&&?cacheType?==?SDImageCacheTypeNone)?{
weakCell.headImageView.alpha=0;
[UIViewanimateWithDuration:1.0animations:^{
weakCell.headImageView.alpha=1.0;
}];
}
else
{
weakCell.headImageView.alpha=1.0;
}
}];
//?用戶名
cell.userName.text=?model.userName;
//?用戶描述
cell.descLabel.text=?model.desc;
//?當(dāng)圖片存在的時(shí)候
if(![model.mainImageURLisEqualToString:@""])
{
//?圖片不隱藏
cell.mainImageView.hidden=NO;
//?配置主圖的方法挽鞠,同頭像
[cell.mainImageViewsd_setImageWithURL:[NSURLURLWithString:model.mainImageURL]completed:^(UIImage*image,NSError*error,?SDImageCacheType?cacheType,NSURL*imageURL)?{
if(image?&&?cacheType?==?SDImageCacheTypeNone)?{
weakCell.mainImageView.alpha=0;
[UIViewanimateWithDuration:1.0animations:^{
weakCell.mainImageView.alpha=1.0;
}];
}
else
{
weakCell.mainImageView.alpha=1.0;
}
}];
//?我們進(jìn)行等比例計(jì)算出剛才那個(gè)主圖高度的約束
cell.mainHeightConstraint.constant=?(model.mainHeight*375)?/?model.mainWidth;
//?底部描述具體圖片底部的約束固定為19
cell.descTopConstraint.constant=19;
}
//?圖片沒(méi)有的時(shí)候疚颊,只顯示描述
{
//?主要圖片隱藏
cell.mainImageView.hidden=YES;
//?主圖的高度越是為0??其實(shí)也代表了隱藏了
cell.mainHeightConstraint.constant=0;
//?底部如果約束還是19的話,會(huì)拉的太長(zhǎng)信认,所以咱們讓他為0
cell.descTopConstraint.constant=0;
}
}
4.那么見(jiàn)證奇跡的時(shí)刻到了材义,按官方說(shuō)法是這樣的:
[objc]view plaincopy
#import?
-?(CGFloat)tableView:(UITableView*)tableViewheightForRowAtIndexPath:(NSIndexPath*)indexPath?{
return[tableViewfd_heightForCellWithIdentifier:@"identifer"cacheByIndexPath:indexPathconfiguration:^(idcell)?{
//?配置?cell?的數(shù)據(jù)源,和?"cellForRow"?干的事一致嫁赏,比如:
[selfconfigCell:(UITableViewCell*)cellindexPath:(NSIndexPath*)indexPath];
}];
}
人家都說(shuō)了其掂,一句話搞定,反正我是這樣的:
[objc]view plaincopy
-?(CGFloat)tableView:(UITableView*)tableViewheightForRowAtIndexPath:(NSIndexPath*)indexPath
{
return[tableViewfd_heightForCellWithIdentifier:identifycacheByIndexPath:indexPathconfiguration:^(MKJTableViewCell*cell)
{
[selfconfigCell:cellindexpath:indexPath];
}];
}
我覺(jué)得挺好用的潦蝇,還是要感謝下有那么牛B的作者款熬!
行注目禮!H疗埂贤牛!作者一生平安!T蛟汀殉簸!
讓我們輕松愉快,不用再糾結(jié)于算Frame了沽讹,簡(jiǎn)單效果如下
本次展示Demo的Github地址:Demo地址般卑,需要的點(diǎn)我各位有啥意見(jiàn)就告訴我,虛心求教
Over~~~~~~~~~~~~~~~~~~
轉(zhuǎn)載地址:http://blog.csdn.net/deft_mkjing/article/details/51569605