Skip to content

Commit 42d7866

Browse files
committed
功能升级,BUG修复。
1 parent bb97f2c commit 42d7866

18 files changed

+344
-62
lines changed

MyLayout.podspec

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ Pod::Spec.new do |s|
1616
#
1717

1818
s.name = "MyLayout"
19-
s.version = "1.9.0beta"
19+
s.version = "1.9.0"
2020
s.summary = "MyLayout is an iOS UI framework integrates the functions with Android,AutoLayout,SizeClass,HTML CSS float and flexbox,UIView UITableView."
2121

2222
s.description = <<-DESC
@@ -90,6 +90,7 @@ Pod::Spec.new do |s|
9090
#s.exclude_files = "Classes/Exclude"
9191

9292
s.public_header_files = "MyLayout/Lib/*.h"
93+
s.private_header_files = "MyLayout/Lib/{*Inner.h,MyLayoutDelegate.h,MyLayoutMath.h,MyGridNode.h,MyLayoutSizeClass.h}"
9394

9495

9596
end

MyLayout/Lib/MyBaseLayout.m

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3550,6 +3550,7 @@ -(void)myCalcSubviewsWrapContentSize:(NSArray<UIView *>*)sbs isEstimate:(BOOL)is
35503550
MyFrame *sbvmyFrame = sbv.myFrame;
35513551
MyViewSizeClass *sbvsc = (MyViewSizeClass *)[sbv myCurrentSizeClassFrom:sbvmyFrame];
35523552

3553+
35533554
if (customSetting != nil)
35543555
customSetting(sbvsc);
35553556

MyLayout/Lib/MyFlexLayout.m

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@ -(CGFloat)width
9393
return MyLayoutSize.wrap;
9494
else if (self.view.widthSizeInner.isFill)
9595
return self.view.widthSizeInner.multiVal == 1 ? MyLayoutSize.fill : self.view.widthSizeInner.multiVal;
96+
else if (self.view.widthSizeInner != nil && self.view.widthSizeInner.dimeValType == MyLayoutValueType_Nil)
97+
return MyLayoutSize.empty;
9698
else if (self.view.widthSizeInner.dimeNumVal != nil)
9799
return self.view.widthSizeInner.dimeNumVal.doubleValue;
98100
else
@@ -113,6 +115,8 @@ -(CGFloat)height
113115
return MyLayoutSize.wrap;
114116
else if (self.view.heightSizeInner.isFill)
115117
return self.view.heightSizeInner.multiVal == 1 ? MyLayoutSize.fill : self.view.heightSizeInner.multiVal;
118+
else if (self.view.heightSizeInner != nil && self.view.heightSizeInner.dimeValType == MyLayoutValueType_Nil)
119+
return MyLayoutSize.empty;
116120
else if (self.view.heightSizeInner.dimeNumVal != nil)
117121
return self.view.heightSizeInner.dimeNumVal.doubleValue;
118122
else
@@ -551,9 +555,9 @@ -(CGSize)calcLayoutSize:(CGSize)size isEstimate:(BOOL)isEstimate pHasSubLayout:(
551555
sbvsc.heightSize.shrink = flexItem.attrs.flex_shrink != MyFlex_Auto? flexItem.attrs.flex_shrink:0;
552556

553557
//如果没有设置尺寸约束则默认是自适应。
554-
if (sbvsc.widthSizeInner.dimeVal == nil)
558+
if (sbvsc.widthSizeInner == nil)
555559
[sbvsc.widthSize __equalTo:@(MyLayoutSize.wrap)];
556-
if (sbvsc.heightSizeInner.dimeVal == nil)
560+
if (sbvsc.heightSizeInner == nil)
557561
[sbvsc.heightSize __equalTo:@(MyLayoutSize.wrap)];
558562

559563
//基准值设置。

MyLayout/Lib/MyFlowLayout.m

Lines changed: 39 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -161,9 +161,11 @@ -(CGSize)calcLayoutSize:(CGSize)size isEstimate:(BOOL)isEstimate pHasSubLayout:(
161161

162162
if (sbvsc.widthSizeInner.dimeWrapVal)
163163
{
164-
if (lsc.pagedCount > 0 ||
165-
(orientation == MyOrientation_Horz && (arrangedGravity & MyGravity_Vert_Mask) == MyGravity_Horz_Fill) ||
166-
(orientation == MyOrientation_Vert && ((gravity & MyGravity_Vert_Mask) == MyGravity_Horz_Fill || sbvsc.weight != 0)))
164+
if (lsc.pagedCount > 0 ||
165+
(orientation == MyOrientation_Vert && sbvsc.weight != 0.0) ||
166+
(arrangedGravity & MyGravity_Vert_Mask) == MyGravity_Horz_Fill ||
167+
(arrangedGravity & MyGravity_Vert_Mask) == MyGravity_Horz_Stretch ||
168+
(gravity & MyGravity_Vert_Mask) == MyGravity_Horz_Fill )
167169
{
168170
if ([sbvsc.view isKindOfClass:[MyBaseLayout class]])
169171
[sbvsc.widthSizeInner __setActive:NO];
@@ -173,8 +175,10 @@ -(CGSize)calcLayoutSize:(CGSize)size isEstimate:(BOOL)isEstimate pHasSubLayout:(
173175
if (sbvsc.heightSizeInner.dimeWrapVal)
174176
{
175177
if (lsc.pagedCount > 0 ||
176-
(orientation == MyOrientation_Vert && (arrangedGravity & MyGravity_Horz_Mask) == MyGravity_Vert_Fill) ||
177-
(orientation == MyOrientation_Horz && ((gravity & MyGravity_Horz_Mask) == MyGravity_Vert_Fill || sbvsc.weight != 0)))
178+
(orientation == MyOrientation_Horz && sbvsc.weight != 0.0) ||
179+
(arrangedGravity & MyGravity_Horz_Mask) == MyGravity_Vert_Fill ||
180+
(arrangedGravity & MyGravity_Horz_Mask) == MyGravity_Vert_Stretch ||
181+
(gravity & MyGravity_Horz_Mask) == MyGravity_Vert_Fill)
178182
{
179183
if ([sbvsc.view isKindOfClass:[MyBaseLayout class]])
180184
[sbvsc.heightSizeInner __setActive:NO];
@@ -1317,7 +1321,7 @@ -(CGSize)myLayout:(MyFlowLayoutViewSizeClass*)lsc calcSizeForVertOrientationCont
13171321
{
13181322
MyViewSizeClass *sbvsc = (MyViewSizeClass*)[sbv myCurrentSizeClassFrom:sbvmyFrame];
13191323
//只有在没有约束,或者非布局视图下的高度自适应约束才会被拉伸。
1320-
if (sbvsc.heightSizeInner.dimeVal == nil || (sbvsc.heightSizeInner.dimeWrapVal && ![sbv isKindOfClass:[MyBaseLayout class]]))
1324+
if (sbvsc.heightSizeInner.dimeVal == nil)
13211325
{
13221326
sbvmyFrame.height += fill;
13231327
}
@@ -1865,7 +1869,7 @@ -(CGSize)myLayout:(MyFlowLayoutViewSizeClass*)lsc calcSizeForVertOrientation:(CG
18651869
if (vertGravity == MyGravity_Vert_Stretch)
18661870
{
18671871
MyViewSizeClass *sbvsc = (MyViewSizeClass*)[sbv myCurrentSizeClassFrom:sbvmyFrame];
1868-
if (sbvsc.heightSizeInner.dimeVal == nil || (sbvsc.heightSizeInner.dimeWrapVal && ![sbv isKindOfClass:[MyBaseLayout class]]))
1872+
if (sbvsc.heightSizeInner.dimeVal == nil)
18691873
{
18701874
sbvmyFrame.height += fill;
18711875
}
@@ -2000,13 +2004,27 @@ -(CGSize)myLayout:(MyFlowLayoutViewSizeClass*)lsc calcSizeForHorzOrientationCont
20002004
MyViewSizeClass *sbvsc = (MyViewSizeClass*)[sbv myCurrentSizeClassFrom:sbvmyFrame];
20012005

20022006
CGFloat topSpace = sbvsc.topPosInner.absVal;
2007+
CGFloat leadingSpace = sbvsc.leadingPosInner.absVal;
20032008
CGFloat bottomSpace = sbvsc.bottomPosInner.absVal;
2009+
CGFloat trailingSpace = sbvsc.trailingPosInner.absVal;
20042010
CGRect rect = sbvmyFrame.frame;
20052011

20062012
//这里先计算一下宽度,因为有可能有宽度固定,高度自适应的情况。
20072013
if (sbvsc.widthSizeInner.dimeVal != nil)
20082014
{
20092015
rect.size.width = [self myLayout:lsc widthSizeValueOfSubview:sbvsc selfSize:selfSize sbvSize:rect.size paddingTop:paddingTop paddingLeading:paddingLeading paddingBottom:paddingBottom paddingTrailing:paddingTrailing];
2016+
2017+
//当只有一行而且是flex标准并且是stretch时会把所有子视图的宽度都强制拉伸为布局视图的宽度
2018+
//所以如果这里是宽度自适应时需要将宽度强制设置为和布局等宽,以便解决同时高度自适应时高度计算不正确的问题。
2019+
if (lineIndex == 0 &&
2020+
sbvsc.widthSizeInner.dimeWrapVal &&
2021+
lsc.isFlex &&
2022+
horzGravity == MyGravity_Horz_Stretch &&
2023+
rect.size.width > selfSize.width - paddingHorz - leadingSpace - trailingSpace)
2024+
{
2025+
rect.size.width = selfSize.width - paddingHorz - leadingSpace - trailingSpace;
2026+
}
2027+
20102028
rect.size.width = [self myValidMeasure:sbvsc.widthSizeInner sbv:sbv calcSize:rect.size.width sbvSize:rect.size selfLayoutSize:selfSize];
20112029
}
20122030
else if (horzGravity == MyGravity_Horz_Fill || horzGravity == MyGravity_Horz_Stretch)
@@ -2263,7 +2281,7 @@ -(CGSize)myLayout:(MyFlowLayoutViewSizeClass*)lsc calcSizeForHorzOrientationCont
22632281
if (horzGravity == MyGravity_Horz_Stretch)
22642282
{
22652283
MyViewSizeClass *sbvsc = (MyViewSizeClass*)[sbv myCurrentSizeClassFrom:sbvmyFrame];
2266-
if (sbvsc.widthSizeInner.dimeVal == nil || (sbvsc.widthSizeInner.dimeWrapVal && ![sbv isKindOfClass:[MyBaseLayout class]]))
2284+
if (sbvsc.widthSizeInner.dimeVal == nil)
22672285
{
22682286
sbvmyFrame.width += fill;
22692287
}
@@ -2441,6 +2459,17 @@ -(CGSize)myLayout:(MyFlowLayoutViewSizeClass*)lsc calcSizeForHorzOrientation:(CG
24412459
else if (sbvsc.widthSizeInner.dimeVal != nil)
24422460
{
24432461
rect.size.width = [self myLayout:lsc widthSizeValueOfSubview:sbvsc selfSize:selfSize sbvSize:rect.size paddingTop:paddingTop paddingLeading:paddingLeading paddingBottom:paddingBottom paddingTrailing:paddingTrailing];
2462+
2463+
// 当只有一行而且是flex标准并且是stretch时会把所有子视图的宽度都强制拉伸为布局视图的宽度
2464+
// 所以如果这里是宽度自适应时需要将宽度强制设置为和布局等宽,以便解决同时高度自适应时高度计算不正确的问题。
2465+
if (arranges == 1 &&
2466+
sbvsc.widthSizeInner.dimeWrapVal &&
2467+
lsc.isFlex &&
2468+
horzGravity == MyGravity_Horz_Stretch &&
2469+
rect.size.width > selfSize.width - paddingHorz - leadingSpace - trailingSpace)
2470+
{
2471+
rect.size.width = selfSize.width - paddingHorz - leadingSpace - trailingSpace;
2472+
}
24442473
}
24452474
else if (horzGravity == MyGravity_Horz_Fill || horzGravity == MyGravity_Horz_Stretch)
24462475
{
@@ -2726,7 +2755,7 @@ -(CGSize)myLayout:(MyFlowLayoutViewSizeClass*)lsc calcSizeForHorzOrientation:(CG
27262755

27272756
selfSize.width = [self myValidMeasure:lsc.widthSizeInner sbv:self calcSize:selfSize.width sbvSize:selfSize selfLayoutSize:self.superview.bounds.size];
27282757
}
2729-
//根据flex规则:如果只有一行则整个高度都作为子视图的拉伸和停靠区域
2758+
//根据flex规则:如果只有一行则整个宽度都作为子视图的拉伸和停靠区域
27302759
if (lsc.isFlex && arranges == 1)
27312760
lineMaxWidth = selfSize.width - paddingHorz;
27322761

@@ -2784,7 +2813,7 @@ -(CGSize)myLayout:(MyFlowLayoutViewSizeClass*)lsc calcSizeForHorzOrientation:(CG
27842813
if (horzGravity == MyGravity_Horz_Stretch)
27852814
{
27862815
MyViewSizeClass *sbvsc = (MyViewSizeClass*)[sbv myCurrentSizeClassFrom:sbvmyFrame];
2787-
if (sbvsc.widthSizeInner.dimeVal == nil || (sbvsc.widthSizeInner.dimeWrapVal && ![sbv isKindOfClass:[MyBaseLayout class]]))
2816+
if (sbvsc.widthSizeInner.dimeVal == nil)
27882817
{
27892818
sbvmyFrame.width += fill;
27902819
}

MyLayout/Lib/MyLayoutPos.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -248,10 +248,7 @@
248248

249249

250250
//通过如下属性获取上面方法设置的值。
251-
@property(nonatomic, strong, readonly) id posVal;
252251
@property(nonatomic, assign, readonly) CGFloat offsetVal;
253-
@property(nonatomic, assign, readonly) CGFloat minVal;
254-
@property(nonatomic, assign, readonly) CGFloat maxVal;
255252

256253

257254
@end

MyLayout/Lib/MyLayoutPos.m

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -170,17 +170,6 @@ -(CGFloat)offsetVal
170170
return self.isActive? _offsetVal : 0;
171171
}
172172

173-
-(CGFloat)minVal
174-
{
175-
return self.isActive && _lBoundVal != nil ? _lBoundVal.posNumVal.doubleValue : -CGFLOAT_MAX;
176-
}
177-
178-
-(CGFloat)maxVal
179-
{
180-
return self.isActive && _uBoundVal != nil ? _uBoundVal.posNumVal.doubleValue : CGFLOAT_MAX;
181-
}
182-
183-
184173
#pragma mark -- NSCopying
185174

186175
-(id)copyWithZone:(NSZone *)zone

MyLayout/Lib/MyLayoutPosInner.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
@property(nonatomic, weak) UIView *view;
1717
@property(nonatomic, assign) MyGravity pos;
1818
@property(nonatomic, assign) MyLayoutValueType posValType;
19-
19+
@property(nonatomic, strong, readonly) id posVal;
2020
@property(nonatomic, readonly, strong) NSNumber *posNumVal;
2121
@property(nonatomic, readonly, strong) MyLayoutPos *posRelaVal;
2222
@property(nonatomic, readonly, strong) NSArray *posArrVal;

MyLayout/Lib/MyLayoutSize.h

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,14 @@
3939
+(NSInteger)fill;
4040
#endif
4141

42+
43+
#if UIKIT_DEFINE_AS_PROPERTIES
44+
/**特殊的尺寸,表示清除尺寸的约束设置,等价于:equalTo(nil)*/
45+
@property(class, nonatomic, assign,readonly) NSInteger empty;
46+
#else
47+
+(NSInteger)empty;
48+
#endif
49+
4250
#if UIKIT_DEFINE_AS_PROPERTIES
4351
/**特殊的尺寸,表示尺寸会均分父视图的剩余空间。目前只用在表格布局MyTableLayout */
4452
@property(class, nonatomic, assign,readonly) NSInteger average;
@@ -65,7 +73,7 @@
6573
/**
6674
设置尺寸的具体值,这个具体值可以设置为NSNumber, MyLayoutSize以及NSArray<MyLayoutSize*>数组,UIView, MyLayoutMostSize和nil值。
6775
68-
1. 设置为NSNumber值表示指定具体的宽度或者高度数值,如果设置为特殊值MyLayoutSize.wrap则表示尺寸自适应,如果设置为LayoutSize.fill则表示等于父视图的尺寸。
76+
1. 设置为NSNumber值表示指定具体的宽度或者高度数值,如果设置为特殊值MyLayoutSize.wrap则表示尺寸自适应,如果设置为MyLayoutSize.fill则表示等于父视图的尺寸,如果设置为MyLayoutSize.empty则表示清空尺寸约束
6977
7078
2. 设置为MyLayoutSize值表示宽度和高度与设置的对象有依赖关系, 甚至可以依赖对象本身
7179
@@ -210,11 +218,9 @@
210218

211219

212220
//上面方法设置的属性的获取。
213-
@property(nonatomic, strong, readonly) id dimeVal;
214221
@property(nonatomic, assign, readonly) CGFloat addVal;
215222
@property(nonatomic, assign, readonly) CGFloat multiVal;
216-
@property(nonatomic, assign, readonly) CGFloat minVal;
217-
@property(nonatomic, assign, readonly) CGFloat maxVal;
223+
218224

219225
/**
220226
判断尺寸值是否是自适应值。

MyLayout/Lib/MyLayoutSize.m

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ @implementation MyLayoutSize
2121
MyLayoutSize *_uBoundVal;
2222
}
2323

24+
+(NSInteger)empty
25+
{
26+
return -100000; //这么定义存粹是一个数字没有其他意义
27+
}
2428

2529
+(NSInteger)wrap
2630
{
@@ -82,7 +86,6 @@ -(id)init
8286
-(MyLayoutSize* (^)(CGFloat val))myAdd
8387
{
8488
return ^id(CGFloat val){
85-
8689
[self __add:val];
8790
[self setNeedsLayout];
8891
return self;
@@ -92,7 +95,6 @@ -(id)init
9295
-(MyLayoutSize* (^)(CGFloat val))myMultiply
9396
{
9497
return ^id(CGFloat val){
95-
9698
[self __multiply:val];
9799
[self setNeedsLayout];
98100
return self;
@@ -102,7 +104,6 @@ -(id)init
102104
-(MyLayoutSize* (^)(CGFloat val))myMin
103105
{
104106
return ^id(CGFloat val){
105-
106107
[self __min:val];
107108
[self setNeedsLayout];
108109
return self;
@@ -112,7 +113,6 @@ -(id)init
112113
-(MyLayoutSize* (^)(id sizeVal, CGFloat addVal, CGFloat multiVal))myLBound
113114
{
114115
return ^id(id sizeVal, CGFloat addVal, CGFloat multiVal){
115-
116116
[self __lBound:sizeVal addVal:addVal multiVal:multiVal];
117117
[self setNeedsLayout];
118118
return self;
@@ -122,7 +122,6 @@ -(id)init
122122
-(MyLayoutSize* (^)(CGFloat val))myMax
123123
{
124124
return ^id(CGFloat val){
125-
126125
[self __max:val];
127126
[self setNeedsLayout];
128127
return self;
@@ -132,7 +131,6 @@ -(id)init
132131
-(MyLayoutSize* (^)(id sizeVal, CGFloat addVal, CGFloat multiVal))myUBound
133132
{
134133
return ^id(id sizeVal, CGFloat addVal, CGFloat multiVal){
135-
136134
[self __uBound:sizeVal addVal:addVal multiVal:multiVal];
137135
[self setNeedsLayout];
138136
return self;
@@ -204,24 +202,14 @@ -(id)dimeVal
204202
return self.isActive ? _dimeVal : nil;
205203
}
206204

207-
-(CGFloat)minVal
208-
{
209-
return (self.isActive && _lBoundVal != nil) ? _lBoundVal.dimeNumVal.doubleValue : -CGFLOAT_MAX;
210-
}
211-
212-
-(CGFloat)maxVal
213-
{
214-
return (self.isActive && _uBoundVal != nil) ? _uBoundVal.dimeNumVal.doubleValue : CGFLOAT_MAX;
215-
}
216-
217205
-(BOOL)isWrap
218206
{
219-
return [self dimeWrapVal];
207+
return _dimeValType == MyLayoutValueType_Wrap;
220208
}
221209

222210
-(BOOL)isFill
223211
{
224-
return [self dimeFillVal];
212+
return _dimeValType == MyLayoutValueType_Fill;
225213
}
226214

227215
#pragma mark -- NSCopying
@@ -354,6 +342,11 @@ -(MyLayoutSize*)__equalTo:(id)val priority:(NSInteger)priority
354342
_dimeValType = MyLayoutValueType_Wrap;
355343
else if ([val integerValue] == MyLayoutSize.fill)
356344
_dimeValType = MyLayoutValueType_Fill;
345+
else if ([val integerValue] == MyLayoutSize.empty)
346+
{
347+
_dimeValType = MyLayoutValueType_Nil;
348+
val = nil;
349+
}
357350
else
358351
_dimeValType = MyLayoutValueType_NSNumber;
359352
}

MyLayout/Lib/MyLayoutSizeClass.m

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,6 @@ -(MyLayoutPos*)topPos
9999
_topPos = [MyLayoutPos new];
100100
_topPos.view = self.view;
101101
_topPos.pos = MyGravity_Vert_Top;
102-
103102
}
104103
return _topPos;
105104
}
@@ -338,7 +337,7 @@ -(MyLayoutSize*)heightSize
338337

339338
-(CGFloat)myWidth
340339
{
341-
//特殊处理设置为MyLayoutSize.wrap的返回
340+
//特殊处理设置为MyLayoutSize.wrap和MyLayoutSize.fill的返回。
342341
if (self.widthSizeInner.dimeValType == MyLayoutValueType_Wrap)
343342
return MyLayoutSize.wrap;
344343
else if (self.widthSizeInner.dimeValType == MyLayoutValueType_Fill)

0 commit comments

Comments
 (0)