麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 系統 > iOS > 正文

iOS實現比例拼圖的方法示例

2019-10-21 18:40:45
字體:
來源:轉載
供稿:網友

需求原型圖:

iOS,比例拼圖

要求:

各個模塊的大小反映各個模塊的占比(銷售額),所有模塊共同組成一個正方形。

后臺返回的數據格式:

{ "result": true, "data": { "category_sale": [ {  "name": "我是你的哥",  "sale_amount": 1,  "gross_margin_ratio": 0.22 }, {  "name": "不是親哥哥",  "sale_amount": 4,  "gross_margin_ratio": 0 }, {  "name": "呵呵噠",  "sale_amount": 3,  "gross_margin_ratio": 0.19 }, {  "name": "因缺思廳",  "sale_amount": 2,  "gross_margin_ratio": 0.4 }] }, "msg": "ok", "code": 200, "executed": "0.0320830345"}

注:gross_margin_ratio代表“毛利率”,不是模塊的占比。

分析

第一眼看到這個原型圖的時候我就覺得不簡單,后面和Android一起研究了一下,也沒有想到什么好的算法。正巧那天上司跑來問我們有沒有什么需要幫忙的,我趕緊把這個問題扔給他。

一周后,他給我說了思路:

每一排放三個,讓它們的高度一致。

經他這么一點,這個問題立即就不是問題了(放3個還是放兩個通過開方得到最合適的值)。

一排放三個模塊,三個一組組成一個矩形,這一組的總面積確定,寬確定,那么高就確定了。高確定,每個模塊的面積確定,每個模塊的寬也就確定了。至于排版

交給UICollectionView就行了。

實現

效果如下:

iOS,比例拼圖

核心代碼:

- (void)setModel:(CQCategoryModel *)model { _model = model;  CGFloat totalSaleAmount = 0; for (CQCategoryItemModel *itemModel in _model.category_sale) { totalSaleAmount += itemModel.sale_amount; }  for (CQCategoryItemModel *itemModel in _model.category_sale) { if (totalSaleAmount == 0) {  // 特殊處理只有一個item,并且SaleAmount還是0的情況  itemModel.ratio = 1; } else {  itemModel.ratio = itemModel.sale_amount/totalSaleAmount; } }  // 計算列數 NSInteger listCount = 0; for (int i = 0; i < _model.category_sale.count; i++) { if (i * i < _model.category_sale.count && (i+1) * (i+1) >= _model.category_sale.count) {  listCount = i+1;  break; } }  // 計算行數 NSInteger rowCount = ceil(_model.category_sale.count / (CGFloat)listCount);  // 這個方陣是listCount*rowCount的矩陣(最后一排可能不足listCount) // 同一排的cell高度相同 for (int i = 0; i < rowCount; i++) { // 行 CGFloat rowArea = 0; // 行面積 for (int j = 0; j < listCount; j++) { // 列  if (i*listCount+j>=_model.category_sale.count) {  break;  }  CQCategoryItemModel *itemModel = _model.category_sale[i*listCount+j];  itemModel.size = itemModel.ratio * (self.collectionView.width*self.collectionView.width);  rowArea += itemModel.size; } // 計算cell的寬高 for (int j = 0; j < listCount; j++) { // 列  if (i*listCount+j>=_model.category_sale.count) {  break;  }  CQCategoryItemModel *itemModel = _model.category_sale[i*listCount+j];  itemModel.height = rowArea / self.collectionView.width;  itemModel.width = itemModel.size / itemModel.height; } }  [self.collectionView reloadData];}- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { CQCategoryItemModel *model = self.model.category_sale[indexPath.row]; // 減去0.01,避免因小數不精確存儲導致一組cell寬度相加超過collectionView的寬度 return CGSizeMake(model.width-0.01, model.height);}

完整demo

https://github.com/CaiWanFeng/iOS_Demo

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到IOS開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 日韩字幕 | 在线看三级 | 久久免费视频3 | av在线播放亚洲 | 北京一级毛片 | 久久99在线 | 国产成人高清在线观看 | 亚洲欧美在线视频免费 | 依依成人精品视频 | 日韩毛片在线看 | 久久精品视频首页 | 久久亚洲美女视频 | 成年人免费黄色片 | 中文字幕线观看 | 精品久久久久久久久久久久久久久久久久久 | 欧美特黄特色视频 | 99国产精品欲a | 性少妇videosexfreexx入片 | 国产xxxx免费 | 久久99精品久久久久久秒播放器 | 久久成人激情视频 | 日韩黄色片网站 | 亚洲日本欧美 | 福利在线免费 | 久久777国产线看观看精品 | 成人在线观看免费爱爱 | 手机av在线电影 | 精品一区二区三区免费爱 | 久久久久一区二区三区四区五区 | 免费在线观看国产精品 | 中国a级黄色片 | 久久九九热re6这里有精品 | 一级国产航空美女毛片内谢 | 在线中文字幕不卡 | 性爱免费视频 | 视频一区二区三区在线播放 | 国产一级在线观看视频 | 久久精品网 | 国产a一级片| 一本大道av | 久久久久久久亚洲视频 |