线上所有马甲包模板,与《猎豆》同UI。域名zhuadd

UIView+SDAutoLayout.h 16KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485
  1. //
  2. // UIView+SDAutoLayout.h
  3. //
  4. // Created by gsd on 15/10/6.
  5. // Copyright (c) 2015年 gsd. All rights reserved.
  6. //
  7. /*
  8. *************************************************************************
  9. --------- INTRODUCTION ---------
  10. USAGE:
  11. MODE 1. >>>>>>>>>>>>>>> You can use it in this way:
  12. Demo.sd_layout
  13. .topSpaceToView(v1, 100)
  14. .bottomSpaceToView(v3, 100)
  15. .leftSpaceToView(v0, 150)
  16. .rightSpaceToView(v2, 150);
  17. MODE 2. >>>>>>>>>>>>>>> You can also use it in this way that is more brevity:
  18. Demo.sd_layout.topSpaceToView(v1, 100).bottomSpaceToView(v3, 100).leftSpaceToView(v0, 150).rightSpaceToView(v2, 150);
  19. *************************************************************************
  20. */
  21. /*
  22. *********************************************************************************
  23. *
  24. * 在您使用此自动布局库的过程中如果出现bug请及时以以下任意一种方式联系我们,我们会及时修复bug并
  25. * 帮您解决问题。
  26. * QQ : 2689718696(gsdios)
  27. * Email : gsdios@126.com
  28. * GitHub: https://github.com/gsdios
  29. * 新浪微博:GSD_iOS
  30. *
  31. * 视频教程:http://www.letv.com/ptv/vplay/24038772.html
  32. * 用法示例:https://github.com/gsdios/SDAutoLayout/blob/master/README.md
  33. *
  34. *********************************************************************************
  35. SDAutoLayout
  36. 版本:2.1.7
  37. 发布:2016.08.12
  38. */
  39. // 如果需要用“断言”调试程序请打开此宏
  40. //#define SDDebugWithAssert
  41. #import <UIKit/UIKit.h>
  42. @class SDAutoLayoutModel, SDUIViewCategoryManager;
  43. typedef SDAutoLayoutModel *(^MarginToView)(id viewOrViewsArray, CGFloat value);
  44. typedef SDAutoLayoutModel *(^Margin)(CGFloat value);
  45. typedef SDAutoLayoutModel *(^MarginEqualToView)(UIView *toView);
  46. typedef SDAutoLayoutModel *(^WidthHeight)(CGFloat value);
  47. typedef SDAutoLayoutModel *(^WidthHeightEqualToView)(UIView *toView, CGFloat ratioValue);
  48. typedef SDAutoLayoutModel *(^AutoHeightWidth)(CGFloat ratioValue);
  49. typedef SDAutoLayoutModel *(^SameWidthHeight)();
  50. typedef SDAutoLayoutModel *(^Offset)(CGFloat value);
  51. typedef void (^SpaceToSuperView)(UIEdgeInsets insets);
  52. @interface SDAutoLayoutModel : NSObject
  53. /*
  54. *************************说明************************
  55. 方法名中带有“SpaceToView”的需要传递2个参数:(UIView)参照view 和 (CGFloat)间距数值
  56. 方法名中带有“RatioToView”的需要传递2个参数:(UIView)参照view 和 (CGFloat)倍数
  57. 方法名中带有“EqualToView”的需要传递1个参数:(UIView)参照view
  58. 方法名中带有“Is”的需要传递1个参数:(CGFloat)数值
  59. *****************************************************
  60. */
  61. /* 设置距离其它view的间距 */
  62. /** 左边到其参照view之间的间距,参数为“(View 或者 view数组, CGFloat)” */
  63. @property (nonatomic, copy, readonly) MarginToView leftSpaceToView;
  64. /** 右边到其参照view之间的间距,参数为“(View, CGFloat)” */
  65. @property (nonatomic, copy, readonly) MarginToView rightSpaceToView;
  66. /** 顶部到其参照view之间的间距,参数为“(View 或者 view数组, CGFloat)” */
  67. @property (nonatomic, copy, readonly) MarginToView topSpaceToView;
  68. /** 底部到其参照view之间的间距,参数为“(View, CGFloat)” */
  69. @property (nonatomic, copy, readonly) MarginToView bottomSpaceToView;
  70. /* 设置x、y、width、height、centerX、centerY 值 */
  71. /** x值,参数为“(CGFloat)” */
  72. @property (nonatomic, copy, readonly) Margin xIs;
  73. /** y值,参数为“(CGFloat)” */
  74. @property (nonatomic, copy, readonly) Margin yIs;
  75. /** centerX值,参数为“(CGFloat)” */
  76. @property (nonatomic, copy, readonly) Margin centerXIs;
  77. /** centerY值,参数为“(CGFloat)” */
  78. @property (nonatomic, copy, readonly) Margin centerYIs;
  79. /** 宽度值,参数为“(CGFloat)” */
  80. @property (nonatomic, copy, readonly) WidthHeight widthIs;
  81. /** 高度值,参数为“(CGFloat)” */
  82. @property (nonatomic, copy, readonly) WidthHeight heightIs;
  83. /* 设置最大宽度和高度、最小宽度和高度 */
  84. /** 最大宽度值,参数为“(CGFloat)” */
  85. @property (nonatomic, copy, readonly) WidthHeight maxWidthIs;
  86. /** 最大高度值,参数为“(CGFloat)” */
  87. @property (nonatomic, copy, readonly) WidthHeight maxHeightIs;
  88. /** 最小宽度值,参数为“(CGFloat)” */
  89. @property (nonatomic, copy, readonly) WidthHeight minWidthIs;
  90. /** 最小高度值,参数为“(CGFloat)” */
  91. @property (nonatomic, copy, readonly) WidthHeight minHeightIs;
  92. /* 设置和某个参照view的边距相同 */
  93. /** 左间距与参照view相同,参数为“(View)” */
  94. @property (nonatomic, copy, readonly) MarginEqualToView leftEqualToView;
  95. /** 右间距与参照view相同,参数为“(View)” */
  96. @property (nonatomic, copy, readonly) MarginEqualToView rightEqualToView;
  97. /** 顶部间距与参照view相同,参数为“(View)” */
  98. @property (nonatomic, copy, readonly) MarginEqualToView topEqualToView;
  99. /** 底部间距与参照view相同,参数为“(View)” */
  100. @property (nonatomic, copy, readonly) MarginEqualToView bottomEqualToView;
  101. /** centerX与参照view相同,参数为“(View)” */
  102. @property (nonatomic, copy, readonly) MarginEqualToView centerXEqualToView;
  103. /** centerY与参照view相同,参数为“(View)” */
  104. @property (nonatomic, copy, readonly) MarginEqualToView centerYEqualToView;
  105. /* 设置宽度或者高度等于参照view的多少倍 */
  106. /** 宽度是参照view宽度的多少倍,参数为“(View, CGFloat)” */
  107. @property (nonatomic, copy, readonly) WidthHeightEqualToView widthRatioToView;
  108. /** 高度是参照view高度的多少倍,参数为“(View, CGFloat)” */
  109. @property (nonatomic, copy, readonly) WidthHeightEqualToView heightRatioToView;
  110. /** 设置一个view的宽度和它的高度相同,参数为空“()” */
  111. @property (nonatomic, copy, readonly) SameWidthHeight widthEqualToHeight;
  112. /** 设置一个view的高度和它的宽度相同,参数为空“()” */
  113. @property (nonatomic, copy, readonly) SameWidthHeight heightEqualToWidth;
  114. /** 自适应高度,传入高宽比值,label可以传0实现文字高度自适应 */
  115. @property (nonatomic, copy, readonly) AutoHeightWidth autoHeightRatio;
  116. /** 自适应宽度,参数为宽高比值 */
  117. @property (nonatomic, copy, readonly) AutoHeightWidth autoWidthRatio;
  118. /* 填充父view(快捷方法) */
  119. /** 传入UIEdgeInsetsMake(top, left, bottom, right),可以快捷设置view到其父view上左下右的间距 */
  120. @property (nonatomic, copy, readonly) SpaceToSuperView spaceToSuperView;
  121. /** 设置偏移量,参数为“(CGFloat value),目前只有带有equalToView的方法可以设置offset” */
  122. @property (nonatomic, copy, readonly) Offset offset;
  123. @property (nonatomic, weak) UIView *needsAutoResizeView;
  124. @end
  125. #pragma mark - UIView 高度、宽度自适应相关方法
  126. @interface UIView (SDAutoHeightWidth)
  127. /** 设置Cell的高度自适应,也可用于设置普通view内容高度自适应 */
  128. - (void)setupAutoHeightWithBottomView:(UIView *)bottomView bottomMargin:(CGFloat)bottomMargin;
  129. /** 用于设置普通view内容宽度自适应 */
  130. - (void)setupAutoWidthWithRightView:(UIView *)rightView rightMargin:(CGFloat)rightMargin;
  131. /** 设置Cell的高度自适应,也可用于设置普通view内容自适应(应用于当你不确定哪个view在自动布局之后会排布在最下方最为bottomView的时候可以调用次方法将所有可能在最下方的view都传过去) */
  132. - (void)setupAutoHeightWithBottomViewsArray:(NSArray *)bottomViewsArray bottomMargin:(CGFloat)bottomMargin;
  133. /** 更新布局(主动刷新布局,如果你需要设置完布局代码就获得view的frame请调用此方法) */
  134. - (void)updateLayout;
  135. /** 更新cell内部的控件的布局(cell内部控件专属的更新约束方法,如果启用了cell frame缓存则会自动清除缓存再更新约束) */
  136. - (void)updateLayoutWithCellContentView:(UIView *)cellContentView;
  137. /** 清空高度自适应设置 */
  138. - (void)clearAutoHeigtSettings;
  139. /** 清空宽度自适应设置 */
  140. - (void)clearAutoWidthSettings;
  141. @property (nonatomic) CGFloat autoHeight;
  142. @property (nonatomic, readonly) SDUIViewCategoryManager *sd_categoryManager;
  143. @property (nonatomic, readonly) NSMutableArray *sd_bottomViewsArray;
  144. @property (nonatomic) CGFloat sd_bottomViewBottomMargin;
  145. @property (nonatomic) NSArray *sd_rightViewsArray;
  146. @property (nonatomic) CGFloat sd_rightViewRightMargin;
  147. @end
  148. #pragma mark - UIView 设置圆角半径、自动布局回调block等相关方法
  149. @interface UIView (SDLayoutExtention)
  150. /** 自动布局完成后的回调block,可以在这里获取到view的真实frame */
  151. @property (nonatomic) void (^didFinishAutoLayoutBlock)(CGRect frame);
  152. /** 添加一组子view */
  153. - (void)sd_addSubviews:(NSArray *)subviews;
  154. /* 设置圆角 */
  155. /** 设置圆角半径值 */
  156. @property (nonatomic, strong) NSNumber *sd_cornerRadius;
  157. /** 设置圆角半径值为view宽度的多少倍 */
  158. @property (nonatomic, strong) NSNumber *sd_cornerRadiusFromWidthRatio;
  159. /** 设置圆角半径值为view高度的多少倍 */
  160. @property (nonatomic, strong) NSNumber *sd_cornerRadiusFromHeightRatio;
  161. /** 设置等宽子view(子view需要在同一水平方向) */
  162. @property (nonatomic, strong) NSArray *sd_equalWidthSubviews;
  163. @end
  164. #pragma mark - UIView 九宫格浮动布局效果
  165. @interface UIView (SDAutoFlowItems)
  166. /**
  167. * 设置类似collectionView效果的固定间距自动宽度浮动子view
  168. * viewsArray : 需要浮动布局的所有视图
  169. * perRowItemsCount : 每行显示的视图个数
  170. * verticalMargin : 视图之间的垂直间距
  171. * horizontalMargin : 视图之间的水平间距
  172. * vInset : 上下缩进值
  173. * hInset : 左右缩进值
  174. */
  175. - (void)setupAutoWidthFlowItems:(NSArray *)viewsArray withPerRowItemsCount:(NSInteger)perRowItemsCount verticalMargin:(CGFloat)verticalMargin horizontalMargin:(CGFloat)horizontalMagin verticalEdgeInset:(CGFloat)vInset horizontalEdgeInset:(CGFloat)hInset;
  176. /** 清除固定间距自动宽度浮动子view设置 */
  177. - (void)clearAutoWidthFlowItemsSettings;
  178. /**
  179. * 设置类似collectionView效果的固定宽带自动间距浮动子view
  180. * viewsArray : 需要浮动布局的所有视图
  181. * perRowItemsCount : 每行显示的视图个数
  182. * verticalMargin : 视图之间的垂直间距
  183. * vInset : 上下缩进值
  184. * hInset : 左右缩进值
  185. */
  186. - (void)setupAutoMarginFlowItems:(NSArray *)viewsArray withPerRowItemsCount:(NSInteger)perRowItemsCount itemWidth:(CGFloat)itemWidth verticalMargin:(CGFloat)verticalMargin verticalEdgeInset:(CGFloat)vInset horizontalEdgeInset:(CGFloat)hInset;
  187. /** 清除固定宽带自动间距浮动子view设置 */
  188. - (void)clearAutoMarginFlowItemsSettings;
  189. @end
  190. #pragma mark - UIView 设置约束、更新约束、清空约束、从父view移除并清空约束、开启cell的frame缓存等相关方法
  191. @interface UIView (SDAutoLayout)
  192. /** 开始自动布局 */
  193. - (SDAutoLayoutModel *)sd_layout;
  194. /** 清空之前的自动布局设置,重新开始自动布局(重新生成布局约束并使其在父view的布局序列数组中位置保持不变) */
  195. - (SDAutoLayoutModel *)sd_resetLayout;
  196. /** 清空之前的自动布局设置,重新开始自动布局(重新生成布局约束并添加到父view布局序列数组中的最后一个位置) */
  197. - (SDAutoLayoutModel *)sd_resetNewLayout;
  198. /** 是否关闭自动布局 */
  199. @property (nonatomic, getter = sd_isClosingAutoLayout) BOOL sd_closeAutoLayout;
  200. /** 从父view移除并清空约束 */
  201. - (void)removeFromSuperviewAndClearAutoLayoutSettings;
  202. /** 清空之前的自动布局设置 */
  203. - (void)sd_clearAutoLayoutSettings;
  204. /** 将自身frame清零(一般在cell内部控件重用前调用) */
  205. - (void)sd_clearViewFrameCache;
  206. /** 将自己的需要自动布局的subviews的frame(或者frame缓存)清零 */
  207. - (void)sd_clearSubviewsAutoLayoutFrameCaches;
  208. /** 设置固定宽度保证宽度不在自动布局过程再做中调整 */
  209. @property (nonatomic, strong) NSNumber *fixedWidth;
  210. /** 设置固定高度保证高度不在自动布局过程中再做调整 */
  211. @property (nonatomic, strong) NSNumber *fixedHeight;
  212. /** 启用cell frame缓存(可以提高cell滚动的流畅度, 目前为cell专用方法,后期会扩展到其他view) */
  213. - (void)useCellFrameCacheWithIndexPath:(NSIndexPath *)indexPath tableView:(UITableView *)tableview;
  214. /** 所属tableview(目前为cell专用属性,后期会扩展到其他view) */
  215. @property (nonatomic) UITableView *sd_tableView;
  216. /** cell的indexPath(目前为cell专用属性,后期会扩展到cell的其他子view) */
  217. @property (nonatomic) NSIndexPath *sd_indexPath;
  218. - (NSMutableArray *)autoLayoutModelsArray;
  219. - (void)addAutoLayoutModel:(SDAutoLayoutModel *)model;
  220. @property (nonatomic) SDAutoLayoutModel *ownLayoutModel;
  221. @property (nonatomic, strong) NSNumber *sd_maxWidth;
  222. @property (nonatomic, strong) NSNumber *autoHeightRatioValue;
  223. @property (nonatomic, strong) NSNumber *autoWidthRatioValue;
  224. @end
  225. #pragma mark - UIScrollView 内容竖向自适应、内容横向自适应方法
  226. @interface UIScrollView (SDAutoContentSize)
  227. /** 设置scrollview内容竖向自适应 */
  228. - (void)setupAutoContentSizeWithBottomView:(UIView *)bottomView bottomMargin:(CGFloat)bottomMargin;
  229. /** 设置scrollview内容横向自适应 */
  230. - (void)setupAutoContentSizeWithRightView:(UIView *)rightView rightMargin:(CGFloat)rightMargin;
  231. @end
  232. #pragma mark - UILabel 开启富文本布局、设置单行文本label宽度自适应、 设置label最多可以显示的行数
  233. @interface UILabel (SDLabelAutoResize)
  234. /** 是否是attributedString */
  235. @property (nonatomic) BOOL isAttributedContent;
  236. /** 设置单行文本label宽度自适应 */
  237. - (void)setSingleLineAutoResizeWithMaxWidth:(CGFloat)maxWidth;
  238. /** 设置label最多可以显示多少行,如果传0则显示所有行文字 */
  239. - (void)setMaxNumberOfLinesToShow:(NSInteger)lineCount;
  240. @end
  241. #pragma mark - UIButton 设置button根据单行文字自适应
  242. @interface UIButton (SDExtention)
  243. /*
  244. * 设置button根据单行文字自适应
  245. * hPadding:左右边距
  246. */
  247. - (void)setupAutoSizeWithHorizontalPadding:(CGFloat)hPadding buttonHeight:(CGFloat)buttonHeight;
  248. @end
  249. #pragma mark - 其他方法(如果有需要可以自己利用以下接口拓展更多功能)
  250. @interface SDAutoLayoutModelItem : NSObject
  251. @property (nonatomic, strong) NSNumber *value;
  252. @property (nonatomic, weak) UIView *refView;
  253. @property (nonatomic, assign) CGFloat offset;
  254. @property (nonatomic, strong) NSArray *refViewsArray;
  255. @end
  256. @interface UIView (SDChangeFrame)
  257. @property (nonatomic) BOOL shouldReadjustFrameBeforeStoreCache;
  258. @property (nonatomic) CGFloat left_sd;
  259. @property (nonatomic) CGFloat top_sd;
  260. @property (nonatomic) CGFloat right_sd;
  261. @property (nonatomic) CGFloat bottom_sd;
  262. @property (nonatomic) CGFloat centerX_sd;
  263. @property (nonatomic) CGFloat centerY_sd;
  264. @property (nonatomic) CGFloat width_sd;
  265. @property (nonatomic) CGFloat height_sd;
  266. @property (nonatomic) CGPoint origin_sd;
  267. @property (nonatomic) CGSize size_sd;
  268. // 兼容旧版本
  269. @property (nonatomic) CGFloat left;
  270. @property (nonatomic) CGFloat top;
  271. @property (nonatomic) CGFloat right;
  272. @property (nonatomic) CGFloat bottom;
  273. @property (nonatomic) CGFloat centerX;
  274. @property (nonatomic) CGFloat centerY;
  275. @property (nonatomic) CGFloat width;
  276. @property (nonatomic) CGFloat height;
  277. @property (nonatomic) CGPoint origin;
  278. @property (nonatomic) CGSize size;
  279. @end
  280. @interface SDUIViewCategoryManager : NSObject
  281. @property (nonatomic, strong) NSArray *rightViewsArray;
  282. @property (nonatomic, assign) CGFloat rightViewRightMargin;
  283. @property (nonatomic, weak) UITableView *sd_tableView;
  284. @property (nonatomic, strong) NSIndexPath *sd_indexPath;
  285. @property (nonatomic, assign) BOOL hasSetFrameWithCache;
  286. @property (nonatomic) BOOL shouldReadjustFrameBeforeStoreCache;
  287. @property (nonatomic, assign, getter = sd_isClosingAutoLayout) BOOL sd_closeAutoLayout;
  288. /** 设置类似collectionView效果的固定间距自动宽度浮动子view */
  289. @property (nonatomic, strong) NSArray *flowItems;
  290. @property (nonatomic, assign) CGFloat verticalMargin;
  291. @property (nonatomic, assign) CGFloat horizontalMargin;
  292. @property (nonatomic, assign) NSInteger perRowItemsCount;
  293. @property (nonatomic, assign) CGFloat lastWidth;
  294. /** 设置类似collectionView效果的固定宽带自动间距浮动子view */
  295. @property (nonatomic, assign) CGFloat flowItemWidth;
  296. @property (nonatomic, assign) BOOL shouldShowAsAutoMarginViews;
  297. @property (nonatomic) CGFloat horizontalEdgeInset;
  298. @property (nonatomic) CGFloat verticalEdgeInset;
  299. @end