Skip to content

Commit

Permalink
功能升级,BUG修复。
Browse files Browse the repository at this point in the history
  • Loading branch information
youngsoft committed Nov 14, 2019
1 parent eb10136 commit 2873e42
Show file tree
Hide file tree
Showing 4 changed files with 255 additions and 149 deletions.
7 changes: 3 additions & 4 deletions MyLayout/Lib/MyFlexLayout.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,6 @@ extern const int MyFlex_Auto;




/*
flexbox中项目的设置类。
*/
Expand Down Expand Up @@ -163,8 +162,8 @@ extern const int MyFlex_Auto;
//条目视图在应用flexbox时的分类扩展,只有MyFlexLayout中的子视图才有用。
@interface UIView(MyFlexLayout)

//我们可以借助视图的flexItem来设置条目视图在弹性布局视图中的一些属性
@property(nonatomic, readonly, strong) MyFlexItem *flexItem;
//我们可以借助视图的myFlex来设置条目视图在弹性布局视图中的一些属性
@property(nonatomic, readonly, strong) MyFlexItem *myFlex;

@end

Expand All @@ -176,6 +175,6 @@ extern const int MyFlex_Auto;
@interface MyFlexLayout:MyFlowLayout

//用于flexbox约束的设置。
@property(nonatomic, readonly, strong, readonly) MyFlex *flex;
@property(nonatomic, readonly, strong) MyFlex *myFlex;

@end
139 changes: 126 additions & 13 deletions MyLayout/Lib/MyFlexLayout.m
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,69 @@ -(instancetype)init
return self;
}

-(void)setOrder:(NSInteger)order
{
if (_order != order)
{
_order = order;
[self.view.superview setNeedsLayout];
}
}

-(void)setFlex_grow:(CGFloat)flex_grow
{
if (_flex_grow != flex_grow)
{
_flex_grow = flex_grow;
[self.view.superview setNeedsLayout];
}
}

-(void)setFlex_shrink:(CGFloat)flex_shrink
{
if (_flex_shrink != flex_shrink)
{
_flex_shrink = flex_shrink;
[self.view.superview setNeedsLayout];
}
}

-(void)setFlex_basis:(CGFloat)flex_basis
{
if (_flex_basis != flex_basis)
{
_flex_basis = flex_basis;
[self.view.superview setNeedsLayout];
}
}

-(void)setAlign_self:(MyFlexGravity)align_self
{
if (_align_self != align_self)
{
_align_self = align_self;
[self.view.superview setNeedsLayout];
}
}

-(void)setWidth:(CGFloat)width
{
if (_width != width)
{
_width = width;
[self.view.superview setNeedsLayout];
}
}

-(void)setHeight:(CGFloat)height
{
if (_height != height)
{
_height = height;
[self.view.superview setNeedsLayout];
}
}

-(CGFloat)margin_top
{
return self.view.myTop;
Expand Down Expand Up @@ -108,9 +171,7 @@ -(instancetype)initWithView:(UIView*)view attrs:(MyFlexItemAttrs*)attrs
_view = view;
_attrs = attrs;
_attrs.view = view;
// _attrs = [MyFlexItemAttrs new];
// _attrs.view = view;
}
}
return self;
}

Expand Down Expand Up @@ -318,6 +379,58 @@ -(instancetype)init
return self;
}

//@property(nonatomic, assign) MyFlexDirection flex_direction;
//@property(nonatomic, assign) MyFlexWrap flex_wrap;
//@property(nonatomic, assign) MyFlexGravity justify_content;
//@property(nonatomic, assign) MyFlexGravity align_items;
//@property(nonatomic, assign) MyFlexGravity align_content;


-(void)setFlex_direction:(MyFlexDirection)flex_direction
{
if (_flex_direction != flex_direction)
{
_flex_direction = flex_direction;
[self.view setNeedsLayout];
}
}

-(void)setFlex_wrap:(MyFlexWrap)flex_wrap
{
if (_flex_wrap != flex_wrap)
{
_flex_wrap = flex_wrap;
[self.view setNeedsLayout];
}
}

-(void)setJustify_content:(MyFlexGravity)justify_content
{
if (_justify_content != justify_content)
{
_justify_content = justify_content;
[self.view setNeedsLayout];
}
}

-(void)setAlign_items:(MyFlexGravity)align_items
{
if (_align_items != align_items)
{
_align_items = align_items;
[self.view setNeedsLayout];
}
}

-(void)setAlign_content:(MyFlexGravity)align_content
{
if (_align_content != align_content)
{
_align_content = align_content;
[self.view setNeedsLayout];
}
}

-(UIEdgeInsets)padding
{
return ((MyFlexLayout*)self.view).padding;
Expand Down Expand Up @@ -437,12 +550,12 @@ -(MyFlexAttrs*)attrs

@implementation UIView(MyFlexLayout)

-(MyFlexItem*)flexItem
-(MyFlexItem*)myFlex
{
MyFlexItem *obj = nil;
if ([self isKindOfClass:[MyFlexLayout class]] )
{
obj = ((MyFlexLayout*)self).flex;
obj = ((MyFlexLayout*)self).myFlex;
}
else
{
Expand All @@ -466,7 +579,7 @@ -(instancetype)init
self = [super init];
if (self != nil)
{
_flex = [[MyFlex alloc] initWithView:self attrs:[MyFlexAttrs new]];
_myFlex = [[MyFlex alloc] initWithView:self attrs:[MyFlexAttrs new]];
self.orientation = MyOrientation_Vert; //默认row
self.arrangedCount = NSIntegerMax; //默认单行
self.isFlex = YES; //满足flexbox的需求。
Expand All @@ -480,7 +593,7 @@ -(CGSize)calcLayoutSize:(CGSize)size isEstimate:(BOOL)isEstimate pHasSubLayout:(
MyFlexLayout *lsc = self.myCurrentSizeClass;

//最先设置方向。
switch (self.flex.attrs.flex_direction) {
switch (self.myFlex.attrs.flex_direction) {
case MyFlexDirection_Column_Reverse: //column_reverse
lsc.orientation = MyOrientation_Horz;
lsc.layoutTransform = CGAffineTransformMake(1,0,0,-1,0,0); //垂直翻转
Expand All @@ -501,7 +614,7 @@ -(CGSize)calcLayoutSize:(CGSize)size isEstimate:(BOOL)isEstimate pHasSubLayout:(
}

//设置换行.
switch (self.flex.attrs.flex_wrap) {
switch (self.myFlex.attrs.flex_wrap) {
case MyFlexWrap_Wrap:
lsc.arrangedCount = 0;
break;
Expand All @@ -522,12 +635,12 @@ -(CGSize)calcLayoutSize:(CGSize)size isEstimate:(BOOL)isEstimate pHasSubLayout:(
//按order排序。
[sbs sortWithOptions:NSSortStable usingComparator:^NSComparisonResult(UIView* _Nonnull obj1, UIView* _Nonnull obj2) {

return obj1.flexItem.attrs.order - obj2.flexItem.attrs.order;
return obj1.myFlex.attrs.order - obj2.myFlex.attrs.order;
}];

for (UIView *sbv in sbs)
{
MyFlexItem *flexItem = sbv.flexItem;
MyFlexItem *flexItem = sbv.myFlex;
UIView *sbvsc = sbv.myCurrentSizeClass;

//flex_grow,如果子视图有设置grow则父视图的换行不起作用。
Expand Down Expand Up @@ -589,7 +702,7 @@ -(CGSize)calcLayoutSize:(CGSize)size isEstimate:(BOOL)isEstimate pHasSubLayout:(
//设置主轴的水平对齐和拉伸
MyGravity vertGravity = lsc.gravity & MyGravity_Horz_Mask;
MyGravity horzGravity = lsc.gravity & MyGravity_Vert_Mask;
switch (self.flex.attrs.justify_content) {
switch (self.myFlex.attrs.justify_content) {
case MyFlexGravity_Flex_End:
if (lsc.orientation == MyOrientation_Vert)
lsc.gravity = MyGravity_Horz_Trailing | vertGravity;
Expand Down Expand Up @@ -626,7 +739,7 @@ -(CGSize)calcLayoutSize:(CGSize)size isEstimate:(BOOL)isEstimate pHasSubLayout:(
//次轴的对齐处理。
MyGravity vertArrangedGravity = lsc.arrangedGravity & MyGravity_Horz_Mask;
MyGravity horzArrangedGravity = lsc.arrangedGravity & MyGravity_Vert_Mask;
switch (self.flex.attrs.align_items) {
switch (self.myFlex.attrs.align_items) {
case MyFlexGravity_Flex_End:
if (lsc.orientation == MyOrientation_Vert)
lsc.arrangedGravity = MyGravity_Vert_Bottom | horzArrangedGravity;
Expand Down Expand Up @@ -663,7 +776,7 @@ -(CGSize)calcLayoutSize:(CGSize)size isEstimate:(BOOL)isEstimate pHasSubLayout:(
//多行下的整体停靠处理。
vertGravity = lsc.gravity & MyGravity_Horz_Mask;
horzGravity = lsc.gravity & MyGravity_Vert_Mask;
switch (self.flex.attrs.align_content) {
switch (self.myFlex.attrs.align_content) {
case MyFlexGravity_Flex_End:
if (lsc.orientation == MyOrientation_Horz)
lsc.gravity = MyGravity_Horz_Trailing | vertGravity;
Expand Down
10 changes: 5 additions & 5 deletions MyLayoutDemo/AllTestExampleViewController.m
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ -(void)example2
-(void)example3
{
//用链式语法创建一个弹性布局,宽度和父视图一致,高度为100
MyFlexLayout *layout = MyFlexLayout.new.flex
MyFlexLayout *layout = MyFlexLayout.new.myFlex
.flex_direction(MyFlexDirection_Row)
.flex_wrap(MyFlexWrap_Wrap)
.align_content(MyFlexGravity_Center)
Expand All @@ -146,23 +146,23 @@ -(void)example3
.addTo(self.view);


UILabel *itemA = UILabel.new.flexItem
UILabel *itemA = UILabel.new.myFlex
.width(MyLayoutSize.fill)
.height(30)
.addTo(layout);

UILabel *itemB = UILabel.new.flexItem
UILabel *itemB = UILabel.new.myFlex
.flex_grow(1)
.align_self(MyFlexGravity_Flex_Start)
.height(30)
.addTo(layout);

UILabel *itemC = UILabel.new.flexItem
UILabel *itemC = UILabel.new.myFlex
.flex_grow(1)
.height(40)
.addTo(layout);

UILabel *itemD = UILabel.new.flexItem
UILabel *itemD = UILabel.new.myFlex
.flex_grow(1)
.height(50)
.addTo(layout);
Expand Down
Loading

0 comments on commit 2873e42

Please sign in to comment.