亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

IOS中封裝自定義布局的步驟

2020-02-19 15:53:38
字體:
來源:轉載
供稿:網友

不管做什么項目,有很多地方都是需要用到自己自定義的,那么IOS中簡單的封裝要怎么布局呢?IOS中封裝自定義布局的步驟大家了解嗎?一起跟著武林技術頻道小編的步伐來了解一下吧!

一、概述
1、對于經常使用的控件或類,通常將其分裝為一個單獨的類來供外界使用,以此達到事半功倍的效果
2、由于分裝的類不依賴于其他的類,所以若要使用該類,可直接將該類拖進項目文件即可
3、在進行分裝的時候,通常需要用到代理設計模式
二、代理設計模式
1、代理設計模式的組成
客戶類(通常作為代理):通常委托這是角色來完成業務邏輯
真實角色:將客戶類的業務邏輯轉化為方法列表,即代理協議
代理協議:

  • 定義了需要實現的業務邏輯
  • 定義了一組方法列表,包括必須實現的方法或選擇實現的方法
  • 代理協議是代理對象所要遵循一組規則

代理角色

  • 若要作為代理,需要遵守代理協議,并且實現必須實現的代理方法
  • 代理角色可以通過調用代理協議中的方法完成業務邏輯,也可以附加自己的操作

文字描述通常是抽象的,一下通過圖示來闡述代理設計模式

三、自定義布局類的封裝
1、業務邏輯
如圖

2、布局每個cell的業務邏輯
由于設置每個cell的布局屬性的業務邏輯較復雜,特附上如下思維導圖

3、封裝思路封裝需要根據客戶類業務邏輯需求來提供接口
1)、通過代理協議的可選實現的方法獲取的屬性值的屬性,需要設置默認值
2)、未提供默認值的且必須使用的屬性,需要通過必須實現的方法來獲得
3)、自定義布局提供的接口可選

  • 列數
  • 列之間的間距
  • 行之間的間距
  • 內邊距

4)、自定義布局提供的接口必選
每個元素的高度,寬度可以通過列數和列間距計算得到
四、封裝步驟
設置代理協議,提供接口

//聲明LYPWaterFlowLayout為一個類@class LYPWaterFlowLayout;@protocol LYPWaterFlowLayoutDelegate //必須實現的方法@required/**獲取瀑布流每個元素的高度*/- (CGFloat)waterFlowLayout:(LYPWaterFlowLayout *)waterFlowLayout heightForItemAtIndex:(NSInteger)index itemWith:(CGFloat)itemWith;//可選實現的方法@optional/**獲取瀑布流的列數*/- (NSInteger)columnCountInWaterFlowLayout:(LYPWaterFlowLayout *)waterFlowLayout;/**獲取瀑布流列間距*/- (CGFloat)columnMarginInWaterFlowLayout:(LYPWaterFlowLayout *)waterFlowLayout;/**獲取瀑布流的行間距*/- (CGFloat)rowMarginInWaterFlowLayout:(LYPWaterFlowLayout *)waterFlowLayout;/**獲取瀑布流的內邊距*/- (UIEdgeInsets)edgeInsetsInWaterFlowLayout:(LYPWaterFlowLayout *)waterFlowLayout;@end

設置代理屬性

@interface LYPWaterFlowLayout : UICollectionViewLayout/**代理*/@property (nonatomic, weak) id delegate;@end

設置通過可選代理方法獲取屬性值的屬性的默認值

/**默認的列數*/static const NSInteger LYPDefaultColumnCount = 3;/**默認每一列之間的間距*/static const CGFloat LYPDefaultColumMargin = 10;/**默認每一行之間的間距*/static const CGFloat LYPDefaultRowMargin = 10;/**默認邊緣間距*/static const UIEdgeInsets LYPDefaultEdgeInsets = {10, 10, 10, 10};

設置通過可選代理方法獲取屬性值的屬性的訪問方式若代理提供屬性值,則忽略默認值

- (NSInteger)columnCount{  //判斷代理是否實現了獲取列數的可選方法  if ([self.delegate respondsToSelector:@selector(columnCountInWaterFlowLayout:)])  {    //實現,返回通過代理設置的列數    return [self.delegate columnCountInWaterFlowLayout:self];  }  else  {    //為實現,返回默認的列數    return LYPDefaultColumnCount;  }}

注:其他屬性值的獲取與上述方法幾乎完全相同,不再贅述
設置布局
1)、設置需要的成員屬性

/**所有cell的布局屬性*/@property (nonatomic, strong) NSMutableArray *attrsArray;/**所有列的當前高度*/@property (nonatomic, strong) NSMutableArray *columnHeights;

2)、通過懶加載的方式初始化成員屬性

/**--attrsArray--懶加載*/- (NSMutableArray *)attrsArray{  if (_attrsArray == nil)  {    _attrsArray = [NSMutableArray array];  }  return _attrsArray;}/**--columnHeights--懶加載*/- (NSMutableArray *)columnHeights{  if (_columnHeights == nil)  {    _columnHeights = [NSMutableArray array];  }  return _columnHeights;}

3)、初始化布局

- (void)prepareLayout{  [super prepareLayout];  /**清除之前跟布局相關的所有屬性,重新設置新的布局*/  //清除之前計算的所有列的高度  [self.columnHeights removeAllObjects];  //設置所有列的初始高度  for (NSInteger i = 0; i

4)、返回包含所有cell的布局屬性的數組

?

- (nullable NSArray *)layoutAttributesForElementsInRect:(CGRect)rect{  return self.attrsArray;}設置每一個cell的布局屬性- (nullable UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(nonnull NSIndexPath *)indexPath{  //獲取indexPath位置的布局屬性  UICollectionViewLayoutAttributes *attrs = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];  /**設置cell布局屬性的frame*/  /***確定cell的尺寸***/  //獲取collectionView的寬度  CGFloat collectionViewWidth = self.collectionView.frame.size.width;  //cell寬度  CGFloat width = ((collectionViewWidth - self.edgeInsets.left - self.edgeInsets.right - (self.columnCount - 1) * self.columMargin)) / self.columnCount;  //cell高度  CGFloat height = [self.delegate waterFlowLayout:self heightForItemAtIndex:indexPath.item itemWith:width];  /***設置cell的位置***/  NSInteger destColumn = 0;  CGFloat minColumnHeight = [self.columnHeights[0] doubleValue];  for (NSInteger i = 1; i columnHeight)    {      minColumnHeight = columnHeight;      destColumn = i;    }  }  //計算cell的位置  CGFloat x = self.edgeInsets.left + destColumn * (width + self.columMargin);  CGFloat y = minColumnHeight;  //判斷是不是第一行  if (y != self.edgeInsets.top)  {    //若不是第一行,需要加上行間距    y += self.rowMargin;  }  /**給cell的布局屬性的frame賦值*/  attrs.frame = CGRectMake(x, y, width, height);  //更新最短那列的高度  self.columnHeights[destColumn] = @(CGRectGetMaxY(attrs.frame));  /**返回indexPath位置的cell的布局屬性*/  return attrs;}

5)、設置collectionView內容的尺寸

- (CGSize)collectionViewContentSize{  //獲取最高的那一列的高度  CGFloat maxColumnHeight = [self.columnHeights[0] doubleValue];  for (NSInteger i = 1; i

以上就是IOS中封裝自定義布局的步驟,相信大家都有了一定的了解,想要了解更多的技術信息,請繼續關注武林技術頻道吧!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91九色蝌蚪国产| 久久69精品久久久久久国产越南| 孩xxxx性bbbb欧美| 久久久久久噜噜噜久久久精品| 中文字幕亚洲情99在线| 国产欧美日韩91| 日本久久91av| 清纯唯美亚洲综合| 国产成人啪精品视频免费网| 日韩欧美福利视频| 国产精品久久久久一区二区| 欧美美女18p| 亚洲国产中文字幕在线观看| 日韩中文字幕av| 亚洲aa中文字幕| 国产成人拍精品视频午夜网站| 亚洲国产精品久久久久久| 欧美乱妇40p| 精品视频偷偷看在线观看| 亚洲色图偷窥自拍| 亚洲国产婷婷香蕉久久久久久| 91久久精品视频| 日韩精品中文字幕在线播放| 亚洲欧美日韩中文视频| 欧美在线视频一二三| 亚洲日本成人女熟在线观看| 少妇高潮久久久久久潘金莲| 成人免费观看网址| 91麻豆桃色免费看| 亚洲最大成人网色| 中文字幕在线看视频国产欧美在线看完整| 91极品视频在线| 精品一区二区三区四区在线| 亚洲女人被黑人巨大进入al| 黑人巨大精品欧美一区二区免费| 91大神在线播放精品| 亚洲一区二区三区四区视频| 欧美精品在线免费| 一本大道香蕉久在线播放29| 国产日本欧美视频| 国产做受高潮69| 欧美日韩国产成人| 91精品久久久久久久久不口人| 亚洲影院色无极综合| 日韩电影在线观看中文字幕| 国产国语刺激对白av不卡| 日韩美女在线观看一区| 久久综合五月天| 国产丝袜一区二区三区免费视频| 夜夜嗨av一区二区三区免费区| 欧美有码在线观看视频| 国产精品美乳一区二区免费| 成人性生交xxxxx网站| 国产精品xxx视频| 疯狂蹂躏欧美一区二区精品| 精品亚洲精品福利线在观看| 777777777亚洲妇女| 日韩精品www| 日韩中文字幕精品视频| 欧美精品激情视频| 97视频色精品| 一区二区三区四区在线观看视频| 亚洲一区二区中文字幕| 国产偷亚洲偷欧美偷精品| 国产精品一区二区三区久久| 日韩中文字幕在线免费观看| 午夜精品理论片| 亚洲第一色在线| 亚洲国产成人爱av在线播放| 国产精品免费福利| 91精品国产一区| 亚洲免费福利视频| 欧美激情一级二级| 日韩中文在线观看| 欧美激情奇米色| 精品国内产的精品视频在线观看| 欧美日韩中国免费专区在线看| 亚洲全黄一级网站| 青青在线视频一区二区三区| 91欧美日韩一区| 日韩hd视频在线观看| 中文字幕成人精品久久不卡| 欧美大片免费观看在线观看网站推荐| 欧美最顶级丰满的aⅴ艳星| 欧美亚洲成人网| 成人中文字幕+乱码+中文字幕| 欧美精品九九久久| 亚洲美女www午夜| 欧美一区视频在线| 色婷婷久久av| 国产欧美久久久久久| 在线免费看av不卡| 欧美成人在线影院| 亚洲欧美另类在线观看| 国产精品亚洲自拍| 中文字幕一精品亚洲无线一区| 欧美丝袜第一区| 中文字幕日韩av综合精品| 91免费的视频在线播放| 国产91网红主播在线观看| 欧美国产日韩免费| 国产精品麻豆va在线播放| 日韩成人在线观看| 亚洲人成欧美中文字幕| 中文字幕亚洲一区| 国产精品99久久久久久人| 国产不卡视频在线| 成人有码在线视频| 亚洲在线视频观看| 日韩精品高清视频| 国产精品久久久av久久久| 国产啪精品视频| 日本免费久久高清视频| 色樱桃影院亚洲精品影院| 亚洲欧美日韩直播| 久久精品国产精品| 国内精品久久久久| 亚洲九九九在线观看| 欧美日韩成人在线观看| 国产一区二区黑人欧美xxxx| 日韩精品视频在线播放| 日韩在线观看视频免费| 欧美中文字幕在线播放| 国产亚洲精品一区二555| 亚洲自拍另类欧美丝袜| 欧美在线视频在线播放完整版免费观看| 91久久久亚洲精品| 北条麻妃一区二区三区中文字幕| 久热99视频在线观看| 日韩视频免费中文字幕| 久久久久这里只有精品| 亚洲精品视频中文字幕| 久久久av免费| 亚洲激情在线观看| 欧美高清视频一区二区| 国产男女猛烈无遮挡91| 欧美日韩国产综合视频在线观看中文| 国产成人在线播放| 国产精品99久久99久久久二8| 精品偷拍各种wc美女嘘嘘| 亚洲第一视频在线观看| 亚洲性av在线| 国产福利视频一区二区| 欧美另类老肥妇| 91久久在线视频| 亚洲成人在线视频播放| 国产三级精品网站| 色偷偷91综合久久噜噜| 亚洲精品国产成人| 欧美电影第一页| 亚洲成人a**站| 欧美日韩国产麻豆| 欧美一区二区三区免费视| 午夜精品久久久久久久白皮肤| 最近2019年好看中文字幕视频| 国产97在线|亚洲| 最近2019年手机中文字幕| 亚洲成av人片在线观看香蕉| 国产精品日韩专区| 国产日韩欧美夫妻视频在线观看| 亚洲国产成人精品电影| 在线视频日本亚洲性| 久久久成人精品| 日韩在线免费观看视频|