[ASTextNode] Implement an example comparing ASTextNode 1 & 2 behavior. (#570)

* fix SIMULATE_WEB_RESPONSE not imported #449

* add constraint to using catching for layout

* Add TextNode example to test Yoga Layout

* update Yoga version

* add debugging log

* fix lisence

* clean up

* clean up

* fix lisence warning

* add shared scheme

* change sdk version

* revert some metadata

* Merge FlexLayoutExample to TextStressText.
Add flags to control different TextNode used.

* clean up

* fix lisence and syntax

* clean up

* remove xcworkspacedata

* Tiny coding style changes

* Another tiny change related to code style
This commit is contained in:
Max Wang 2017-10-17 07:03:53 -07:00 committed by Huy Nguyen
parent c12509e67a
commit dce7ab3a9b
9 changed files with 284 additions and 13 deletions

View File

@ -1,6 +1,6 @@
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
target 'Sample' do
pod 'Texture', :path => '../..'
pod 'Texture/Yoga', :path => '../..'
end

View File

@ -14,6 +14,9 @@
6C2C82AC19EE274300767484 /* Default-667h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 6C2C82AA19EE274300767484 /* Default-667h@2x.png */; };
6C2C82AD19EE274300767484 /* Default-736h@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 6C2C82AB19EE274300767484 /* Default-736h@3x.png */; };
92F1263CECFE3FFCC7A5F936 /* libPods-Sample.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E8EC8300ABAAEA079224272A /* libPods-Sample.a */; };
C081EE8D1F85AEEC00F0B5F1 /* TabBarController.m in Sources */ = {isa = PBXBuildFile; fileRef = C081EE8C1F85AEEC00F0B5F1 /* TabBarController.m */; };
C081EE921F85AFB800F0B5F1 /* CollectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C081EE8F1F85AFB800F0B5F1 /* CollectionViewController.m */; };
C081EE931F85AFB800F0B5F1 /* TextCellNode.m in Sources */ = {isa = PBXBuildFile; fileRef = C081EE911F85AFB800F0B5F1 /* TextCellNode.m */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
@ -29,6 +32,12 @@
6C2C82AA19EE274300767484 /* Default-667h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-667h@2x.png"; sourceTree = SOURCE_ROOT; };
6C2C82AB19EE274300767484 /* Default-736h@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-736h@3x.png"; sourceTree = SOURCE_ROOT; };
A950870A2154F92D5DC91F1A /* Pods-Sample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Sample.release.xcconfig"; path = "Pods/Target Support Files/Pods-Sample/Pods-Sample.release.xcconfig"; sourceTree = "<group>"; };
C081EE8B1F85AEEC00F0B5F1 /* TabBarController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TabBarController.h; sourceTree = "<group>"; };
C081EE8C1F85AEEC00F0B5F1 /* TabBarController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TabBarController.m; sourceTree = "<group>"; };
C081EE8E1F85AFB800F0B5F1 /* CollectionViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CollectionViewController.h; sourceTree = "<group>"; };
C081EE8F1F85AFB800F0B5F1 /* CollectionViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CollectionViewController.m; sourceTree = "<group>"; };
C081EE901F85AFB800F0B5F1 /* TextCellNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextCellNode.h; sourceTree = "<group>"; };
C081EE911F85AFB800F0B5F1 /* TextCellNode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TextCellNode.m; sourceTree = "<group>"; };
E8EC8300ABAAEA079224272A /* libPods-Sample.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Sample.a"; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */
@ -68,11 +77,17 @@
05E2128319D4DB510098F589 /* Sample */ = {
isa = PBXGroup;
children = (
C081EE8E1F85AFB800F0B5F1 /* CollectionViewController.h */,
C081EE8F1F85AFB800F0B5F1 /* CollectionViewController.m */,
C081EE901F85AFB800F0B5F1 /* TextCellNode.h */,
C081EE911F85AFB800F0B5F1 /* TextCellNode.m */,
05E2128819D4DB510098F589 /* AppDelegate.h */,
05E2128919D4DB510098F589 /* AppDelegate.m */,
05E2128B19D4DB510098F589 /* ViewController.h */,
05E2128C19D4DB510098F589 /* ViewController.m */,
05E2128419D4DB510098F589 /* Supporting Files */,
C081EE8B1F85AEEC00F0B5F1 /* TabBarController.h */,
C081EE8C1F85AEEC00F0B5F1 /* TabBarController.m */,
);
path = Sample;
sourceTree = "<group>";
@ -181,13 +196,16 @@
files = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-Sample-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n";
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
96436DA0C1AFF84D8041B522 /* [CP] Embed Pods Frameworks */ = {
@ -227,8 +245,11 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
C081EE931F85AFB800F0B5F1 /* TextCellNode.m in Sources */,
05E2128D19D4DB510098F589 /* ViewController.m in Sources */,
C081EE8D1F85AEEC00F0B5F1 /* TabBarController.m in Sources */,
05E2128A19D4DB510098F589 /* AppDelegate.m in Sources */,
C081EE921F85AFB800F0B5F1 /* CollectionViewController.m in Sources */,
05E2128719D4DB510098F589 /* main.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;

View File

@ -1,25 +1,39 @@
/* This file provided by Facebook is for non-commercial testing and evaluation
* purposes only. Facebook reserves all rights not expressly granted.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
//
// AppDelegate.m
// Texture
//
// Copyright (c) 2017-present, Pinterest, Inc. All rights reserved.
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
#import "AppDelegate.h"
#import "TabBarController.h"
#import "CollectionViewController.h"
#import "ViewController.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
self.window.rootViewController = [[ViewController alloc] init];
ViewController *viewController = [[ViewController alloc] init];
viewController.tabBarItem.title = @"TextStress";
CollectionViewController *cvc = [[CollectionViewController alloc] init];
cvc.tabBarItem.title = @"Flexbox";
TabBarController *tabBarController = [[TabBarController alloc] init];
tabBarController.viewControllers = @[cvc, viewController];
self.window.rootViewController = tabBarController;
[self.window makeKeyAndVisible];
return YES;
}

View File

@ -0,0 +1,17 @@
//
// CollectionViewController.h
// Texture
//
// Copyright (c) 2017-present, Pinterest, Inc. All rights reserved.
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
#import <UIKit/UIKit.h>
#import <AsyncDisplayKit/AsyncDisplayKit.h>
@interface CollectionViewController : ASViewController
@end

View File

@ -0,0 +1,67 @@
//
// CollectionViewController.m
// Texture
//
// Copyright (c) 2017-present, Pinterest, Inc. All rights reserved.
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
#import "CollectionViewController.h"
#import "TextCellNode.h"
@interface CollectionViewController() <ASCollectionDataSource, ASCollectionDelegate>
{
ASCollectionNode *_collectionNode;
NSArray<NSString *> *_labels;
TextCellNode *_cellNode;
}
@end
@implementation CollectionViewController
- (instancetype)init
{
UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init];
_collectionNode = [[ASCollectionNode alloc] initWithCollectionViewLayout:flowLayout];
CGRect rect = [[UIApplication sharedApplication] statusBarFrame];
_collectionNode.contentInset = UIEdgeInsetsMake(rect.size.height, 0, 0, 0);
self = [super initWithNode:_collectionNode];
if (self) {
_collectionNode.delegate = self;
_collectionNode.dataSource = self;
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
_collectionNode.backgroundColor = [UIColor whiteColor];
_labels = @[@"Fight of the Living Dead: Experiment Fight of the Living Dead: Experiment", @"S1 • E1"];
}
- (NSInteger)collectionNode:(ASCollectionNode *)collectionNode numberOfItemsInSection:(NSInteger)section
{
return 1;
}
- (ASCellNodeBlock)collectionNode:(ASCollectionNode *)collectionNode nodeBlockForItemAtIndexPath:(NSIndexPath *)indexPath
{
return ^{
_cellNode = [[TextCellNode alloc] initWithText1:_labels[0] text2:_labels[1]];
return _cellNode;
};
}
- (ASSizeRange)collectionNode:(ASCollectionNode *)collectionNode constrainedSizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
CGFloat width = collectionNode.view.bounds.size.width;
return ASSizeRangeMake(CGSizeMake(width, 0.0f), CGSizeMake(width, CGFLOAT_MAX));
}
@end

View File

@ -0,0 +1,16 @@
//
// TabBarController.h
// Texture
//
// Copyright (c) 2017-present, Pinterest, Inc. All rights reserved.
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
#import <AsyncDisplayKit/AsyncDisplayKit.h>
@interface TabBarController : ASTabBarController
@end

View File

@ -0,0 +1,19 @@
//
// TabBarController.m
// Texture
//
// Copyright (c) 2017-present, Pinterest, Inc. All rights reserved.
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
#import "TabBarController.h"
@interface TabBarController ()
@end
@implementation TabBarController
@end

View File

@ -0,0 +1,17 @@
//
// TextCellNode.h
// Texture
//
// Copyright (c) 2017-present, Pinterest, Inc. All rights reserved.
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
#import <AsyncDisplayKit/AsyncDisplayKit.h>
@interface TextCellNode : ASCellNode
- (instancetype)initWithText1:(NSString *)text1 text2:(NSString *)text2;
@end

View File

@ -0,0 +1,100 @@
//
// TextCellNode.m
// Texture
//
// Copyright (c) 2017-present, Pinterest, Inc. All rights reserved.
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
#import "TextCellNode.h"
#import <AsyncDisplayKit/AsyncDisplayKit.h>
#import <AsyncDisplayKit/ASDisplayNode+Beta.h>
#ifndef USE_ASTEXTNODE_2
#define USE_ASTEXTNODE_2 1
#endif
@interface TextCellNode()
{
#if USE_ASTEXTNODE_2
ASTextNode2 *_label1;
ASTextNode2 *_label2;
#else
ASTextNode *_label1;
ASTextNode *_label2;
#endif
}
@end
@implementation TextCellNode
- (instancetype)initWithText1:(NSString *)text1 text2:(NSString *)text2
{
self = [super init];
if (self) {
self.automaticallyManagesSubnodes = YES;
self.clipsToBounds = YES;
#if USE_ASTEXTNODE_2
_label1 = [[ASTextNode2 alloc] init];
_label2 = [[ASTextNode2 alloc] init];
#else
_label1 = [[ASTextNode alloc] init];
_label2 = [[ASTextNode alloc] init];
#endif
_label1.attributedText = [[NSAttributedString alloc] initWithString:text1];
_label2.attributedText = [[NSAttributedString alloc] initWithString:text2];
_label1.maximumNumberOfLines = 1;
_label1.truncationMode = NSLineBreakByTruncatingTail;
_label2.maximumNumberOfLines = 1;
_label2.truncationMode = NSLineBreakByTruncatingTail;
[self simpleSetupYogaLayout];
}
return self;
}
/**
This is to text a row with two labels, the first should be truncated with "...".
Layout is like: [l1Container[_label1], label2].
This shows a bug of ASTextNode2.
*/
- (void)simpleSetupYogaLayout
{
[self.style yogaNodeCreateIfNeeded];
[_label1.style yogaNodeCreateIfNeeded];
[_label2.style yogaNodeCreateIfNeeded];
_label1.style.flexGrow = 0;
_label1.style.flexShrink = 1;
_label1.backgroundColor = [UIColor lightGrayColor];
_label2.style.flexGrow = 0;
_label2.style.flexShrink = 0;
_label2.backgroundColor = [UIColor greenColor];
ASDisplayNode *l1Container = [ASDisplayNode yogaVerticalStack];
// TODO(fix ASTextNode2): next two line will show the bug of TextNode2
// which works for ASTextNode though
// see discussion here: https://github.com/TextureGroup/Texture/pull/553
l1Container.style.alignItems = ASStackLayoutAlignItemsCenter;
_label1.style.alignSelf = ASStackLayoutAlignSelfStart;
l1Container.style.flexGrow = 0;
l1Container.style.flexShrink = 1;
l1Container.yogaChildren = @[_label1];
self.style.justifyContent = ASStackLayoutJustifyContentSpaceBetween;
self.style.alignItems = ASStackLayoutAlignItemsStart;
self.style.flexDirection = ASStackLayoutDirectionHorizontal;
self.yogaChildren = @[l1Container, _label2];
}
@end