AsyncDisplayKit 复杂布局的界面流畅

piaotu1.png

最近学习AsyncDisplayKit的使用,现在将自己这几天的学习的成果记录一下,大家可以看一下,有什么不对的或者更好的方法大家也可以学习交流一下。AsyncDisplayKit的使用好处:在复杂布局的界面流畅丝毫不弱。(原理大家可以去看官方文档 http://texturegroup.org/docs/getting-started.html

第一天

AsyncDisplayKit的使用在官网上有相关的技术文档以及demo,自己可以边学习边看(网址:https://github.com/facebookarchive/AsyncDisplayKit)。第一天的第一步就是导入AsyncDisplayKit控件,我用的是cocoapod安装的直接pod 'AsyncDisplayKit' 就可以啦,也可以将我项目中的文件发直接拖过去用(demo在后面)。下面是AsyncDisplayKit的控件以及布局

UIKit 节点容器
UICollectionView ASCollectionNode
UIPageViewController ASPagerNode
UITableView ASTableNode
UIViewController ASViewController
UINavigationController. ASNavigationControllerImplements the ASVisibility protocol.
UITabBarController ASTabBarController Implements the ASVisibility protocol
UIView ASDisplayNode
UITableViewCell & UICollectionViewCell ASCellNode
UIScrollView ASScrollNode
UITextView ASEditableTextNode
UILabel ASTextNode
UIImage ASImageNode, ASNetworkImageNode, ASMultiplexImageNode
AVPlayerLayer ASVideoNode
UIMoviePlayer ASVideoPlayerNode
UIButton ASButtonNode
MKMapView ASMapNode

ASLayoutSpec子类布局

布局 作用
ASWrapperLayoutSpec ASWrapperLayoutSpec是一个简单的ASLayoutSpec子类,可以ASLayoutElement根据布局元素上设置的大小来包装和计算小孩的布局。ASWrapperLayoutSpec是轻松返回单个子节点的理想选择-layoutSpecThatFits:。可选地,该子节点可以设置大小信息。但是,如果您需要设置除了大小的位置,请ASAbsoluteLayoutSpec改用。
ASStackLayoutSpec Texture中的所有layoutSpecs中,ASStackLayoutSpec是最有用和最强大的。ASStackLayoutSpec使用flexbox算法来确定其子项的位置和大小。Flexbox旨在为不同的屏幕尺寸提供一致的布局。在堆叠布局中,您可以在垂直或水平堆叠中对齐项目。堆栈布局可以是另一个堆栈布局的子代,这使得可以使用堆栈布局规范创建几乎任何布局。ASStackLayoutSpec除了其<ASLayoutElement>属性,还有8个属性:1.direction:指定孩子被堆叠的方向。如果设置了horizo​​ntalAlignment和verticalAlignment,则它们将被再次解析,从而相应地更新justifyContent和alignItems。2.spacing:每个子节点之间的空间量。3.horizontalAlignment:指定子节点如何水平对齐。取决于堆栈方向,设置对齐将导致justifyContent或alignItems被更新。未来方向改变后,对齐将保持有效。因此,优选这些性质。4.verticalAlignment:指定子节点如何垂直对齐。取决于堆栈方向,设置对齐将导致justifyContentalignItems被更新。未来方向改变后,对齐将保持有效。因此,优选这些性质。5.justifyContent:每个子节点之间的空间量。6.alignItems:子节点内的横贯方向。7.flexWrap:子节点是否被堆叠成单行或多行。默认为单行。8.alignContent:如果有多条线,沿横轴的线的方向。
ASInsetLayoutSpec ASInsetLayoutSpec将其传递constrainedSize.max CGSize给其子节点,然后减去其插值。一旦子节点确定它的最终大小,插图规格将其最终大小按照其子节点的大小加上其插入边距。由于插图布局规范的大小基于其子节点的大小,因此子节点必须具有内在大小或明确设置其大小。
ASOverlayLayoutSpec 把它的子节点放在另一个组件上,作为叠加,覆盖规格的大小是根据子节点的大小计算的,子节点必须具有固有的大小或设置的大小(子节点在下面)
ASBackgroundLayoutSpec 放置一个组件,将其后面的另一个组件作为背景展开。背景规格的大小根据子节点的大小计算,重要的是子节点必须具有固有的大小或设置的大小(子节点在上面)
ASCenterLayoutSpec ASCenterLayoutSpec其中心内最大的子节点constrainedSize,ASCenterLayoutSpec 有两个属性:centeringOptions:确定子节点在中心规格中居中的方式。选项包括:None,X​​,Y,XY。sizingOptions:确定中心规格将占用多少空间。选项包括:Default,最小X,最小Y,最小XY。
ASRatioLayoutSpec 可以扩展的固定长宽比布置组件。该规范必须有一个宽度或高度传递给它作为约束尺寸,因为它使用此值来缩放自身。
ASRelativeLayoutSpec 根据垂直和水平位置说明符,放置组件并将其放置在布局边界内。类似于“9部分”图像区域,子节点可以位于四个角中的任何一个,也可以位于四个边中的任何一个以及中心。
ASAbsoluteLayoutSpec 在ASAbsoluteLayoutSpec您可以指定确切位置设定自己的(X / Y坐标)其子节点的layoutPosition
ASLayoutSpec 所有布局规范的子类的主类。主要工作是处理所有的子节点管理,但也可以用来创建自定义的布局规范。

第二天

今天我大概分析一下我的页面布局,下图就是我的页面布局示意图,整体是ASTableNode搭建,里面一条一条内容我使用的是for循环创建ASDisPlayNode(绿色方框内的),ASDisPlayNode中的图片是ASCollectionNode创建的。绿色部分我刚开始用的是ASTableNode,开始使用ASTableView控件但是在后面的ASCollectionNode点击事件不响应(具体原因我还不知道,大家如果有知道可以告诉我一下啊)


1.png

第三天

今天主要将页面搭建完成,以及数据加载,里面涉及到布局以及控件使用大家可以查考AsyncDisplayKit官方文档或者官方示例demo(如果官方示例demo不能运行记得将工程pod install 一下就行了)。下面是我的布局代码:


#import "OneCellNode.h"

@implementation OneCellNode
- (instancetype)initWithCommentItem:(OrderModel *)item indexPath:(NSIndexPath *)indexPath{
    if (self = [super init]) {
        self.index = indexPath;
        self.orderNodel = item;
        [self addDateNode];
        [self addTitleNode];
        [self addDescNode];
        [self addGoodNode];
    }
    return self;

}
- (void)addDateNode{
    self.dateNode = [[DateView alloc] initWithCommentItem:self.orderNodel.time date:self.orderNodel.date dateNum:self.orderNodel.dayCount];
    self.dateNode.backgroundColor = [UIColor whiteColor];
    [self addSubnode:self.dateNode];
}
- (void)addTitleNode{
    self.titleNode = [[ASTextNode alloc] init];
    self.titleNode.layerBacked = YES;
    self.titleNode.maximumNumberOfLines = 0;
    NSDictionary *attrs = @{ NSFontAttributeName: [UIFont fontWithName:@"HelveticaNeue" size:15.0f] ,NSForegroundColorAttributeName:UIColorFromRGB(0x444444)};
    self.titleNode.attributedText = [[NSAttributedString alloc]initWithString:self.orderNodel.title attributes:attrs];
    [self addSubnode:self.titleNode]; 
}
- (void)addDescNode{
    self.descNode = [[ASTextNode alloc] init];
    self.descNode.layerBacked = YES;
    self.descNode.maximumNumberOfLines = 0;
    NSDictionary *attrs = @{ NSFontAttributeName: [UIFont fontWithName:@"HelveticaNeue" size:15.0f] ,NSForegroundColorAttributeName:UIColorFromRGB(0x444444)};
    self.descNode.attributedText = [[NSAttributedString alloc]initWithString:self.orderNodel.desc attributes:attrs];
    [self addSubnode:self.descNode];  
}

- (void)addGoodNode{
    NSMutableArray *array = [NSMutableArray arrayWithCapacity:self.orderNodel.goodArray.count];
   //遍历循环创建每个商品条目
    for (int i = 0; i<self.orderNodel.goodArray.count; i++) {
                GoodImageView *node = [[GoodImageView alloc]initWithCommentItem:self.orderNodel.goodArray[i]];
                [self addSubnode:node];
                [array addObject:node];
            }
      _replayNodes = [array copy];
}
- (void)layout{
    [super layout];
    self.dateNode.frame = CGRectMake(0, 0, 130, self.frame.size.height);
}
- (ASLayoutSpec *)layoutSpecThatFits:(ASSizeRange)constrainedSize{
    NSMutableArray *rightArray =[[NSMutableArray alloc] initWithObjects:_titleNode, _descNode,nil];
    [rightArray addObjectsFromArray:_replayNodes];
    ASStackLayoutSpec *rightStackLayout = [ASStackLayoutSpec stackLayoutSpecWithDirection:ASStackLayoutDirectionVertical spacing:8 justifyContent:ASStackLayoutJustifyContentStart alignItems:ASStackLayoutAlignItemsStart children:rightArray];
    rightStackLayout.style.flexGrow = YES;
    rightStackLayout.style.flexShrink  = YES;
 //给dateNode节点一个宽度,高度可以随意
    self.dateNode.style.preferredSize =  CGSizeMake(130 ,100);
    self.dateNode.style.flexShrink = YES;
    ASStackLayoutSpec *horStackLayout = [ASStackLayoutSpec stackLayoutSpecWithDirection:ASStackLayoutDirectionHorizontal spacing:0 justifyContent:ASStackLayoutJustifyContentStart alignItems:ASStackLayoutAlignItemsStart children:@[self.dateNode,rightStackLayout]];
    horStackLayout.style.flexShrink = YES;
    return horStackLayout;
}

第四天

项目已经完成了,功能也能实现了,但是关于纵向的紫色线条高度我一直没有搞定,紫色线条是一个ASDisplayNode控件,在页面中要设置他的高度否则不显示,最后找了一个方法在layout方法中固定其宽高,代码方法如下

- (void)layout{
    [super layout];
    self.dateNode.frame = CGRectMake(0, 0, 130, self.frame.size.height);
}

第五天

项目基本完成,将自己这几天的开发过程记录下来,来看一下效果

app.gif

demo:https://github.com/guofeifeifei/AsyncDisplayKitWuLiu
如果大家有好的方法也可以告诉我,我也会持续更新、时时在线,
在网上发现一个好的AsyncDisplayKit框架做的项目:https://github.com/12207480/LovePlayNews

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342