Added example of typical social app layout example

This commit is contained in:
Vitaly Baev
2015-11-06 17:09:11 +03:00
parent b1784bcf9b
commit 78293ad785
42 changed files with 1390 additions and 0 deletions

View File

@@ -0,0 +1,3 @@
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
pod 'AsyncDisplayKit', :path => '../..'

View File

@@ -0,0 +1,478 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
1DAE4C3A5DA2C2B081CD640F /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7577801AA7321797C5FBB9A1 /* libPods.a */; };
3EEA4EE91BECC4A1008A7F35 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 3EEA4EE81BECC4A1008A7F35 /* main.m */; };
3EEA4EEC1BECC4A1008A7F35 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 3EEA4EEB1BECC4A1008A7F35 /* AppDelegate.m */; };
3EEA4EEF1BECC4A1008A7F35 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3EEA4EEE1BECC4A1008A7F35 /* ViewController.m */; };
3EEA4EF41BECC4A1008A7F35 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 3EEA4EF31BECC4A1008A7F35 /* Assets.xcassets */; };
3EEA4F011BECC4E8008A7F35 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3EEA4EFE1BECC4E8008A7F35 /* Default-568h@2x.png */; };
3EEA4F021BECC4E8008A7F35 /* Default-667h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3EEA4EFF1BECC4E8008A7F35 /* Default-667h@2x.png */; };
3EEA4F031BECC4E8008A7F35 /* Default-736h@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3EEA4F001BECC4E8008A7F35 /* Default-736h@3x.png */; };
3EEA4F061BECC6C9008A7F35 /* Post.m in Sources */ = {isa = PBXBuildFile; fileRef = 3EEA4F051BECC6C9008A7F35 /* Post.m */; };
3EEA4F091BECC855008A7F35 /* PostNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 3EEA4F081BECC855008A7F35 /* PostNode.m */; };
3EEA4F0C1BECCA0A008A7F35 /* TextStyles.m in Sources */ = {isa = PBXBuildFile; fileRef = 3EEA4F0B1BECCA0A008A7F35 /* TextStyles.m */; };
3EEA4F141BECDCD6008A7F35 /* icon_android.png in Resources */ = {isa = PBXBuildFile; fileRef = 3EEA4F0E1BECDCD6008A7F35 /* icon_android.png */; };
3EEA4F151BECDCD6008A7F35 /* icon_android@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3EEA4F0F1BECDCD6008A7F35 /* icon_android@2x.png */; };
3EEA4F161BECDCD6008A7F35 /* icon_android@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3EEA4F101BECDCD6008A7F35 /* icon_android@3x.png */; };
3EEA4F171BECDCD6008A7F35 /* icon_ios.png in Resources */ = {isa = PBXBuildFile; fileRef = 3EEA4F111BECDCD6008A7F35 /* icon_ios.png */; };
3EEA4F181BECDCD6008A7F35 /* icon_ios@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3EEA4F121BECDCD6008A7F35 /* icon_ios@2x.png */; };
3EEA4F191BECDCD6008A7F35 /* icon_ios@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3EEA4F131BECDCD6008A7F35 /* icon_ios@3x.png */; };
3EEA4F1D1BECE358008A7F35 /* LikesNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 3EEA4F1C1BECE358008A7F35 /* LikesNode.m */; };
3EEA4F2A1BECE440008A7F35 /* icon_liked.png in Resources */ = {isa = PBXBuildFile; fileRef = 3EEA4F1E1BECE440008A7F35 /* icon_liked.png */; };
3EEA4F2B1BECE440008A7F35 /* icon_liked@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3EEA4F1F1BECE440008A7F35 /* icon_liked@2x.png */; };
3EEA4F2C1BECE440008A7F35 /* icon_liked@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3EEA4F201BECE440008A7F35 /* icon_liked@3x.png */; };
3EEA4F301BECE440008A7F35 /* icon_like@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3EEA4F241BECE440008A7F35 /* icon_like@3x.png */; };
3EEA4F311BECE440008A7F35 /* icon_like@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3EEA4F251BECE440008A7F35 /* icon_like@2x.png */; };
3EEA4F321BECE440008A7F35 /* icon_like.png in Resources */ = {isa = PBXBuildFile; fileRef = 3EEA4F261BECE440008A7F35 /* icon_like.png */; };
3EEA4F331BECE440008A7F35 /* icon_comment@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3EEA4F271BECE440008A7F35 /* icon_comment@3x.png */; };
3EEA4F341BECE440008A7F35 /* icon_comment@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3EEA4F281BECE440008A7F35 /* icon_comment@2x.png */; };
3EEA4F351BECE440008A7F35 /* icon_comment.png in Resources */ = {isa = PBXBuildFile; fileRef = 3EEA4F291BECE440008A7F35 /* icon_comment.png */; };
3EEA4F381BECE775008A7F35 /* CommentsNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 3EEA4F371BECE775008A7F35 /* CommentsNode.m */; };
3EEA4F3C1BECE99F008A7F35 /* icon_more.png in Resources */ = {isa = PBXBuildFile; fileRef = 3EEA4F391BECE99F008A7F35 /* icon_more.png */; };
3EEA4F3D1BECE99F008A7F35 /* icon_more@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3EEA4F3A1BECE99F008A7F35 /* icon_more@2x.png */; };
3EEA4F3E1BECE99F008A7F35 /* icon_more@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3EEA4F3B1BECE99F008A7F35 /* icon_more@3x.png */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
3EEA4EE41BECC4A1008A7F35 /* Sample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Sample.app; sourceTree = BUILT_PRODUCTS_DIR; };
3EEA4EE81BECC4A1008A7F35 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
3EEA4EEA1BECC4A1008A7F35 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
3EEA4EEB1BECC4A1008A7F35 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
3EEA4EED1BECC4A1008A7F35 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = "<group>"; };
3EEA4EEE1BECC4A1008A7F35 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = "<group>"; };
3EEA4EF31BECC4A1008A7F35 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
3EEA4EF81BECC4A1008A7F35 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
3EEA4EFE1BECC4E8008A7F35 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = "<group>"; };
3EEA4EFF1BECC4E8008A7F35 /* Default-667h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-667h@2x.png"; sourceTree = "<group>"; };
3EEA4F001BECC4E8008A7F35 /* Default-736h@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-736h@3x.png"; sourceTree = "<group>"; };
3EEA4F041BECC6C9008A7F35 /* Post.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Post.h; sourceTree = "<group>"; };
3EEA4F051BECC6C9008A7F35 /* Post.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Post.m; sourceTree = "<group>"; };
3EEA4F071BECC855008A7F35 /* PostNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PostNode.h; sourceTree = "<group>"; };
3EEA4F081BECC855008A7F35 /* PostNode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PostNode.m; sourceTree = "<group>"; };
3EEA4F0A1BECCA0A008A7F35 /* TextStyles.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextStyles.h; sourceTree = "<group>"; };
3EEA4F0B1BECCA0A008A7F35 /* TextStyles.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TextStyles.m; sourceTree = "<group>"; };
3EEA4F0E1BECDCD6008A7F35 /* icon_android.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon_android.png; sourceTree = "<group>"; };
3EEA4F0F1BECDCD6008A7F35 /* icon_android@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon_android@2x.png"; sourceTree = "<group>"; };
3EEA4F101BECDCD6008A7F35 /* icon_android@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon_android@3x.png"; sourceTree = "<group>"; };
3EEA4F111BECDCD6008A7F35 /* icon_ios.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon_ios.png; sourceTree = "<group>"; };
3EEA4F121BECDCD6008A7F35 /* icon_ios@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon_ios@2x.png"; sourceTree = "<group>"; };
3EEA4F131BECDCD6008A7F35 /* icon_ios@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon_ios@3x.png"; sourceTree = "<group>"; };
3EEA4F1B1BECE358008A7F35 /* LikesNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LikesNode.h; sourceTree = "<group>"; };
3EEA4F1C1BECE358008A7F35 /* LikesNode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LikesNode.m; sourceTree = "<group>"; };
3EEA4F1E1BECE440008A7F35 /* icon_liked.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon_liked.png; sourceTree = "<group>"; };
3EEA4F1F1BECE440008A7F35 /* icon_liked@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon_liked@2x.png"; sourceTree = "<group>"; };
3EEA4F201BECE440008A7F35 /* icon_liked@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon_liked@3x.png"; sourceTree = "<group>"; };
3EEA4F241BECE440008A7F35 /* icon_like@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon_like@3x.png"; sourceTree = "<group>"; };
3EEA4F251BECE440008A7F35 /* icon_like@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon_like@2x.png"; sourceTree = "<group>"; };
3EEA4F261BECE440008A7F35 /* icon_like.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon_like.png; sourceTree = "<group>"; };
3EEA4F271BECE440008A7F35 /* icon_comment@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon_comment@3x.png"; sourceTree = "<group>"; };
3EEA4F281BECE440008A7F35 /* icon_comment@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon_comment@2x.png"; sourceTree = "<group>"; };
3EEA4F291BECE440008A7F35 /* icon_comment.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon_comment.png; sourceTree = "<group>"; };
3EEA4F361BECE775008A7F35 /* CommentsNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CommentsNode.h; sourceTree = "<group>"; };
3EEA4F371BECE775008A7F35 /* CommentsNode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CommentsNode.m; sourceTree = "<group>"; };
3EEA4F391BECE99F008A7F35 /* icon_more.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon_more.png; sourceTree = "<group>"; };
3EEA4F3A1BECE99F008A7F35 /* icon_more@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon_more@2x.png"; sourceTree = "<group>"; };
3EEA4F3B1BECE99F008A7F35 /* icon_more@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon_more@3x.png"; sourceTree = "<group>"; };
7577801AA7321797C5FBB9A1 /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; };
839964CA580D0ED921A6FCB1 /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = "Pods/Target Support Files/Pods/Pods.release.xcconfig"; sourceTree = "<group>"; };
E38AD915EE10CFC641F39E5C /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = "Pods/Target Support Files/Pods/Pods.debug.xcconfig"; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
3EEA4EE11BECC4A1008A7F35 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
1DAE4C3A5DA2C2B081CD640F /* libPods.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
3EEA4EDB1BECC4A1008A7F35 = {
isa = PBXGroup;
children = (
3EEA4EE61BECC4A1008A7F35 /* Sample */,
3EEA4EE51BECC4A1008A7F35 /* Products */,
842ADAFE88475D19B24183AC /* Pods */,
EED34FA6D8171DF44757C852 /* Frameworks */,
);
sourceTree = "<group>";
};
3EEA4EE51BECC4A1008A7F35 /* Products */ = {
isa = PBXGroup;
children = (
3EEA4EE41BECC4A1008A7F35 /* Sample.app */,
);
name = Products;
sourceTree = "<group>";
};
3EEA4EE61BECC4A1008A7F35 /* Sample */ = {
isa = PBXGroup;
children = (
3EEA4F0D1BECDCA6008A7F35 /* Images */,
3EEA4EEA1BECC4A1008A7F35 /* AppDelegate.h */,
3EEA4EEB1BECC4A1008A7F35 /* AppDelegate.m */,
3EEA4EED1BECC4A1008A7F35 /* ViewController.h */,
3EEA4EEE1BECC4A1008A7F35 /* ViewController.m */,
3EEA4EF31BECC4A1008A7F35 /* Assets.xcassets */,
3EEA4EF81BECC4A1008A7F35 /* Info.plist */,
3EEA4EE71BECC4A1008A7F35 /* Supporting Files */,
3EEA4F041BECC6C9008A7F35 /* Post.h */,
3EEA4F051BECC6C9008A7F35 /* Post.m */,
3EEA4F071BECC855008A7F35 /* PostNode.h */,
3EEA4F081BECC855008A7F35 /* PostNode.m */,
3EEA4F0A1BECCA0A008A7F35 /* TextStyles.h */,
3EEA4F0B1BECCA0A008A7F35 /* TextStyles.m */,
3EEA4F1B1BECE358008A7F35 /* LikesNode.h */,
3EEA4F1C1BECE358008A7F35 /* LikesNode.m */,
3EEA4F361BECE775008A7F35 /* CommentsNode.h */,
3EEA4F371BECE775008A7F35 /* CommentsNode.m */,
);
path = Sample;
sourceTree = "<group>";
};
3EEA4EE71BECC4A1008A7F35 /* Supporting Files */ = {
isa = PBXGroup;
children = (
3EEA4EFE1BECC4E8008A7F35 /* Default-568h@2x.png */,
3EEA4EFF1BECC4E8008A7F35 /* Default-667h@2x.png */,
3EEA4F001BECC4E8008A7F35 /* Default-736h@3x.png */,
3EEA4EE81BECC4A1008A7F35 /* main.m */,
);
name = "Supporting Files";
sourceTree = "<group>";
};
3EEA4F0D1BECDCA6008A7F35 /* Images */ = {
isa = PBXGroup;
children = (
3EEA4F391BECE99F008A7F35 /* icon_more.png */,
3EEA4F3A1BECE99F008A7F35 /* icon_more@2x.png */,
3EEA4F3B1BECE99F008A7F35 /* icon_more@3x.png */,
3EEA4F1E1BECE440008A7F35 /* icon_liked.png */,
3EEA4F1F1BECE440008A7F35 /* icon_liked@2x.png */,
3EEA4F201BECE440008A7F35 /* icon_liked@3x.png */,
3EEA4F241BECE440008A7F35 /* icon_like@3x.png */,
3EEA4F251BECE440008A7F35 /* icon_like@2x.png */,
3EEA4F261BECE440008A7F35 /* icon_like.png */,
3EEA4F271BECE440008A7F35 /* icon_comment@3x.png */,
3EEA4F281BECE440008A7F35 /* icon_comment@2x.png */,
3EEA4F291BECE440008A7F35 /* icon_comment.png */,
3EEA4F0E1BECDCD6008A7F35 /* icon_android.png */,
3EEA4F0F1BECDCD6008A7F35 /* icon_android@2x.png */,
3EEA4F101BECDCD6008A7F35 /* icon_android@3x.png */,
3EEA4F111BECDCD6008A7F35 /* icon_ios.png */,
3EEA4F121BECDCD6008A7F35 /* icon_ios@2x.png */,
3EEA4F131BECDCD6008A7F35 /* icon_ios@3x.png */,
);
name = Images;
sourceTree = "<group>";
};
842ADAFE88475D19B24183AC /* Pods */ = {
isa = PBXGroup;
children = (
E38AD915EE10CFC641F39E5C /* Pods.debug.xcconfig */,
839964CA580D0ED921A6FCB1 /* Pods.release.xcconfig */,
);
name = Pods;
sourceTree = "<group>";
};
EED34FA6D8171DF44757C852 /* Frameworks */ = {
isa = PBXGroup;
children = (
7577801AA7321797C5FBB9A1 /* libPods.a */,
);
name = Frameworks;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
3EEA4EE31BECC4A1008A7F35 /* Sample */ = {
isa = PBXNativeTarget;
buildConfigurationList = 3EEA4EFB1BECC4A1008A7F35 /* Build configuration list for PBXNativeTarget "Sample" */;
buildPhases = (
B5BD9E5609B2CB179EEE0CF4 /* Check Pods Manifest.lock */,
3EEA4EE01BECC4A1008A7F35 /* Sources */,
3EEA4EE11BECC4A1008A7F35 /* Frameworks */,
3EEA4EE21BECC4A1008A7F35 /* Resources */,
F8CD1BCEB86661EF98DB1C0C /* Embed Pods Frameworks */,
21F2C1D9B53F9468EAF1653F /* Copy Pods Resources */,
);
buildRules = (
);
dependencies = (
);
name = Sample;
productName = Sample;
productReference = 3EEA4EE41BECC4A1008A7F35 /* Sample.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
3EEA4EDC1BECC4A1008A7F35 /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 0710;
ORGANIZATIONNAME = Facebook;
TargetAttributes = {
3EEA4EE31BECC4A1008A7F35 = {
CreatedOnToolsVersion = 7.1;
};
};
};
buildConfigurationList = 3EEA4EDF1BECC4A1008A7F35 /* Build configuration list for PBXProject "Sample" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 3EEA4EDB1BECC4A1008A7F35;
productRefGroup = 3EEA4EE51BECC4A1008A7F35 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
3EEA4EE31BECC4A1008A7F35 /* Sample */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
3EEA4EE21BECC4A1008A7F35 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
3EEA4F2A1BECE440008A7F35 /* icon_liked.png in Resources */,
3EEA4F181BECDCD6008A7F35 /* icon_ios@2x.png in Resources */,
3EEA4F311BECE440008A7F35 /* icon_like@2x.png in Resources */,
3EEA4F3D1BECE99F008A7F35 /* icon_more@2x.png in Resources */,
3EEA4F141BECDCD6008A7F35 /* icon_android.png in Resources */,
3EEA4F3E1BECE99F008A7F35 /* icon_more@3x.png in Resources */,
3EEA4F2B1BECE440008A7F35 /* icon_liked@2x.png in Resources */,
3EEA4F351BECE440008A7F35 /* icon_comment.png in Resources */,
3EEA4EF41BECC4A1008A7F35 /* Assets.xcassets in Resources */,
3EEA4F171BECDCD6008A7F35 /* icon_ios.png in Resources */,
3EEA4F021BECC4E8008A7F35 /* Default-667h@2x.png in Resources */,
3EEA4F161BECDCD6008A7F35 /* icon_android@3x.png in Resources */,
3EEA4F191BECDCD6008A7F35 /* icon_ios@3x.png in Resources */,
3EEA4F331BECE440008A7F35 /* icon_comment@3x.png in Resources */,
3EEA4F341BECE440008A7F35 /* icon_comment@2x.png in Resources */,
3EEA4F321BECE440008A7F35 /* icon_like.png in Resources */,
3EEA4F151BECDCD6008A7F35 /* icon_android@2x.png in Resources */,
3EEA4F301BECE440008A7F35 /* icon_like@3x.png in Resources */,
3EEA4F2C1BECE440008A7F35 /* icon_liked@3x.png in Resources */,
3EEA4F011BECC4E8008A7F35 /* Default-568h@2x.png in Resources */,
3EEA4F031BECC4E8008A7F35 /* Default-736h@3x.png in Resources */,
3EEA4F3C1BECE99F008A7F35 /* icon_more.png in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
21F2C1D9B53F9468EAF1653F /* Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "Copy Pods Resources";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-resources.sh\"\n";
showEnvVarsInLog = 0;
};
B5BD9E5609B2CB179EEE0CF4 /* Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "Check Pods Manifest.lock";
outputPaths = (
);
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";
showEnvVarsInLog = 0;
};
F8CD1BCEB86661EF98DB1C0C /* Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "Embed Pods Frameworks";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
3EEA4EE01BECC4A1008A7F35 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
3EEA4EEF1BECC4A1008A7F35 /* ViewController.m in Sources */,
3EEA4EEC1BECC4A1008A7F35 /* AppDelegate.m in Sources */,
3EEA4EE91BECC4A1008A7F35 /* main.m in Sources */,
3EEA4F061BECC6C9008A7F35 /* Post.m in Sources */,
3EEA4F0C1BECCA0A008A7F35 /* TextStyles.m in Sources */,
3EEA4F381BECE775008A7F35 /* CommentsNode.m in Sources */,
3EEA4F091BECC855008A7F35 /* PostNode.m in Sources */,
3EEA4F1D1BECE358008A7F35 /* LikesNode.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin XCBuildConfiguration section */
3EEA4EF91BECC4A1008A7F35 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 9.1;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
};
name = Debug;
};
3EEA4EFA1BECC4A1008A7F35 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 9.1;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
VALIDATE_PRODUCT = YES;
};
name = Release;
};
3EEA4EFC1BECC4A1008A7F35 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = E38AD915EE10CFC641F39E5C /* Pods.debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
INFOPLIST_FILE = Sample/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.facebook.AsyncDisplayKit.Sample;
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Debug;
};
3EEA4EFD1BECC4A1008A7F35 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 839964CA580D0ED921A6FCB1 /* Pods.release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
INFOPLIST_FILE = Sample/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.facebook.AsyncDisplayKit.Sample;
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
3EEA4EDF1BECC4A1008A7F35 /* Build configuration list for PBXProject "Sample" */ = {
isa = XCConfigurationList;
buildConfigurations = (
3EEA4EF91BECC4A1008A7F35 /* Debug */,
3EEA4EFA1BECC4A1008A7F35 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
3EEA4EFB1BECC4A1008A7F35 /* Build configuration list for PBXNativeTarget "Sample" */ = {
isa = XCConfigurationList;
buildConfigurations = (
3EEA4EFC1BECC4A1008A7F35 /* Debug */,
3EEA4EFD1BECC4A1008A7F35 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 3EEA4EDC1BECC4A1008A7F35 /* Project object */;
}

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:Sample.xcodeproj">
</FileRef>
</Workspace>

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:Sample.xcodeproj">
</FileRef>
<FileRef
location = "group:Pods/Pods.xcodeproj">
</FileRef>
</Workspace>

View File

@@ -0,0 +1,17 @@
//
// AppDelegate.h
// Sample
//
// Created by Vitaly Baev on 06.11.15.
// Copyright © 2015 Facebook. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@end

View File

@@ -0,0 +1,29 @@
//
// AppDelegate.m
// Sample
//
// Created by Vitaly Baev on 06.11.15.
// Copyright © 2015 Facebook. All rights reserved.
//
#import "AppDelegate.h"
#import "ViewController.h"
@interface AppDelegate ()
@end
@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 = [[UINavigationController alloc] initWithRootViewController:[[ViewController alloc] init]];
[self.window makeKeyAndVisible];
return YES;
}
@end

View File

@@ -0,0 +1,38 @@
{
"images" : [
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "60x60",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "60x60",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

View File

@@ -0,0 +1,22 @@
//
// CommentsNode.h
// Sample
//
// Created by Vitaly Baev on 06.11.15.
// Copyright © 2015 Facebook. All rights reserved.
//
#import <AsyncDisplayKit/AsyncDisplayKit.h>
@interface CommentsNode : ASControlNode {
ASImageNode *_iconNode;
ASTextNode *_countNode;
NSInteger _comentsCount;
}
- (instancetype)initWithCommentsCount:(NSInteger)comentsCount;
@end

View File

@@ -0,0 +1,61 @@
//
// CommentsNode.m
// Sample
//
// Created by Vitaly Baev on 06.11.15.
// Copyright © 2015 Facebook. All rights reserved.
//
#import "CommentsNode.h"
#import "TextStyles.h"
@implementation CommentsNode
- (instancetype)initWithCommentsCount:(NSInteger)comentsCount {
self = [super init];
if(self) {
_comentsCount = comentsCount;
_iconNode = [[ASImageNode alloc] init];
_iconNode.image = [UIImage imageNamed:@"icon_comment.png"];
[self addSubnode:_iconNode];
_countNode = [[ASTextNode alloc] init];
if(_comentsCount > 0) {
_countNode.attributedString = [[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"%ld", (long)_comentsCount] attributes:[TextStyles cellControlStyle]];
}
[self addSubnode:_countNode];
// make it tappable easily
self.hitTestSlop = UIEdgeInsetsMake(-10, -10, -10, -10);
}
return self;
}
- (ASLayoutSpec *)layoutSpecThatFits:(ASSizeRange)constrainedSize {
ASStackLayoutSpec *mainStack = [ASStackLayoutSpec stackLayoutSpecWithDirection:ASStackLayoutDirectionHorizontal spacing:6.0 justifyContent:ASStackLayoutJustifyContentStart alignItems:ASStackLayoutAlignItemsCenter children:@[_iconNode, _countNode]];
// set sizeRange to make width fixed to 60
mainStack.sizeRange = ASRelativeSizeRangeMake(ASRelativeSizeMake(
ASRelativeDimensionMakeWithPoints(60.0),
ASRelativeDimensionMakeWithPoints(0.0)
), ASRelativeSizeMake(
ASRelativeDimensionMakeWithPoints(60.0),
ASRelativeDimensionMakeWithPoints(40.0)
));
return [ASStaticLayoutSpec staticLayoutSpecWithChildren:@[mainStack]];
}
@end

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

View File

@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
</dict>
</plist>

View File

@@ -0,0 +1,25 @@
//
// LikesNode.h
// Sample
//
// Created by Vitaly Baev on 06.11.15.
// Copyright © 2015 Facebook. All rights reserved.
//
#import <AsyncDisplayKit/AsyncDisplayKit.h>
@interface LikesNode : ASControlNode {
ASImageNode *_iconNode;
ASTextNode *_countNode;
NSInteger _likesCount;
BOOL _liked;
}
- (instancetype)initWithLikesCount:(NSInteger)likesCount;
+ (BOOL) getYesOrNo;
@end

View File

@@ -0,0 +1,72 @@
//
// LikesNode.m
// Sample
//
// Created by Vitaly Baev on 06.11.15.
// Copyright © 2015 Facebook. All rights reserved.
//
#import "LikesNode.h"
#import "TextStyles.h"
@implementation LikesNode
- (instancetype)initWithLikesCount:(NSInteger)likesCount {
self = [super init];
if(self) {
_likesCount = likesCount;
_liked = (_likesCount > 0) ? [LikesNode getYesOrNo] : NO;
_iconNode = [[ASImageNode alloc] init];
_iconNode.image = (_liked) ? [UIImage imageNamed:@"icon_liked.png"] : [UIImage imageNamed:@"icon_like.png"];
[self addSubnode:_iconNode];
_countNode = [[ASTextNode alloc] init];
if(_likesCount > 0) {
if(_liked) {
_countNode.attributedString = [[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"%ld", (long)_likesCount] attributes:[TextStyles cellControlColoredStyle]];
}else {
_countNode.attributedString = [[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"%ld", (long)_likesCount] attributes:[TextStyles cellControlStyle]];
}
}
[self addSubnode:_countNode];
// make it tappable easily
self.hitTestSlop = UIEdgeInsetsMake(-10, -10, -10, -10);
}
return self;
}
+ (BOOL) getYesOrNo
{
int tmp = (arc4random() % 30)+1;
if(tmp % 5 == 0)
return YES;
return NO;
}
- (ASLayoutSpec *)layoutSpecThatFits:(ASSizeRange)constrainedSize {
ASStackLayoutSpec *mainStack = [ASStackLayoutSpec stackLayoutSpecWithDirection:ASStackLayoutDirectionHorizontal spacing:6.0 justifyContent:ASStackLayoutJustifyContentStart alignItems:ASStackLayoutAlignItemsCenter children:@[_iconNode, _countNode]];
// set sizeRange to make width fixed to 60
mainStack.sizeRange = ASRelativeSizeRangeMake(ASRelativeSizeMake(
ASRelativeDimensionMakeWithPoints(60.0),
ASRelativeDimensionMakeWithPoints(0.0)
), ASRelativeSizeMake(
ASRelativeDimensionMakeWithPoints(60.0),
ASRelativeDimensionMakeWithPoints(40.0)
));
return [ASStaticLayoutSpec staticLayoutSpecWithChildren:@[mainStack]];
}
@end

View File

@@ -0,0 +1,24 @@
//
// Post.h
// Sample
//
// Created by Vitaly Baev on 06.11.15.
// Copyright © 2015 Facebook. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Post : NSObject
@property (nonatomic, strong) NSString *username;
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSString *photo;
@property (nonatomic, strong) NSString *post;
@property (nonatomic, strong) NSString *time;
@property (nonatomic, strong) NSString *media;
@property (nonatomic, assign) NSInteger via;
@property (nonatomic, assign) NSInteger likes;
@property (nonatomic, assign) NSInteger comments;
@end

View File

@@ -0,0 +1,13 @@
//
// Post.m
// Sample
//
// Created by Vitaly Baev on 06.11.15.
// Copyright © 2015 Facebook. All rights reserved.
//
#import "Post.h"
@implementation Post
@end

View File

@@ -0,0 +1,35 @@
//
// PostNode.h
// Sample
//
// Created by Vitaly Baev on 06.11.15.
// Copyright © 2015 Facebook. All rights reserved.
//
#import <AsyncDisplayKit/AsyncDisplayKit.h>
#import "Post.h"
@class LikesNode;
@class CommentsNode;
@interface PostNode : ASCellNode <ASTextNodeDelegate> {
Post *_post;
ASDisplayNode *_divider;
ASTextNode *_nameNode;
ASTextNode *_usernameNode;
ASTextNode *_timeNode;
ASTextNode *_postNode;
ASImageNode *_viaNode;
ASNetworkImageNode *_avatarNode;
ASNetworkImageNode *_mediaNode;
LikesNode *_likesNode;
CommentsNode *_commentsNode;
ASImageNode *_optionsNode;
}
- (instancetype)initWithPost:(Post *)post;
@end

View File

@@ -0,0 +1,258 @@
//
// PostNode.m
// Sample
//
// Created by Vitaly Baev on 06.11.15.
// Copyright © 2015 Facebook. All rights reserved.
//
#import "PostNode.h"
#import "TextStyles.h"
#import "LikesNode.h"
#import "CommentsNode.h"
@implementation PostNode
- (instancetype)initWithPost:(Post *)post {
self = [super init];
if(self) {
_post = post;
// name node
_nameNode = [[ASTextNode alloc] init];
_nameNode.attributedString = [[NSAttributedString alloc] initWithString:_post.name
attributes:[TextStyles nameStyle]];
_nameNode.maximumLineCount = 1;
[self addSubnode:_nameNode];
// username node
_usernameNode = [[ASTextNode alloc] init];
_usernameNode.attributedString = [[NSAttributedString alloc] initWithString:_post.username
attributes:[TextStyles usernameStyle]];
_usernameNode.flexShrink = YES; //if name and username don't fit to cell width, allow username shrink
_usernameNode.truncationMode = NSLineBreakByTruncatingTail;
_usernameNode.maximumLineCount = 1;
[self addSubnode:_usernameNode];
// time node
_timeNode = [[ASTextNode alloc] init];
_timeNode.attributedString = [[NSAttributedString alloc] initWithString:_post.time
attributes:[TextStyles timeStyle]];
[self addSubnode:_timeNode];
// post node
_postNode = [[ASTextNode alloc] init];
// processing URLs in post
NSString *kLinkAttributeName = @"TextLinkAttributeName";
if(![_post.post isEqualToString:@""]) {
NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:_post.post attributes:[TextStyles postStyle]];
NSDataDetector *urlDetector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink error:nil];
[urlDetector enumerateMatchesInString:attrString.string options:kNilOptions range:NSMakeRange(0, attrString.string.length) usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop){
if (result.resultType == NSTextCheckingTypeLink) {
NSMutableDictionary *linkAttributes = [[NSMutableDictionary alloc] initWithDictionary:[TextStyles postLinkStyle]];
linkAttributes[kLinkAttributeName] = [NSURL URLWithString:result.URL.absoluteString];
[attrString addAttributes:linkAttributes range:result.range];
}
}];
// configure node to support tappable links
_postNode.delegate = self;
_postNode.userInteractionEnabled = YES;
_postNode.linkAttributeNames = @[ kLinkAttributeName ];
_postNode.attributedString = attrString;
}
[self addSubnode:_postNode];
// media
if(![_post.media isEqualToString:@""]) {
_mediaNode = [[ASNetworkImageNode alloc] init];
_mediaNode.backgroundColor = ASDisplayNodeDefaultPlaceholderColor();
_mediaNode.cornerRadius = 4.0;
_mediaNode.URL = [NSURL URLWithString:_post.media];
_mediaNode.imageModificationBlock = ^UIImage *(UIImage *image) {
UIImage *modifiedImage;
CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height);
UIGraphicsBeginImageContextWithOptions(image.size, false, [[UIScreen mainScreen] scale]);
[[UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:8.0] addClip];
[image drawInRect:rect];
modifiedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return modifiedImage;
};
[self addSubnode:_mediaNode];
}
// user pic
_avatarNode = [[ASNetworkImageNode alloc] init];
_avatarNode.backgroundColor = ASDisplayNodeDefaultPlaceholderColor();
_avatarNode.preferredFrameSize = CGSizeMake(44, 44);
_avatarNode.cornerRadius = 22.0;
_avatarNode.URL = [NSURL URLWithString:_post.photo];
_avatarNode.imageModificationBlock = ^UIImage *(UIImage *image) {
UIImage *modifiedImage;
CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height);
UIGraphicsBeginImageContextWithOptions(image.size, false, [[UIScreen mainScreen] scale]);
[[UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:44.0] addClip];
[image drawInRect:rect];
modifiedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return modifiedImage;
};
[self addSubnode:_avatarNode];
// hairline cell separator
_divider = [[ASDisplayNode alloc] init];
_divider.backgroundColor = [UIColor lightGrayColor];
[self addSubnode:_divider];
if(_post.via != 0) {
_viaNode = [[ASImageNode alloc] init];
_viaNode.image = (_post.via == 1) ? [UIImage imageNamed:@"icon_ios.png"] : [UIImage imageNamed:@"icon_android.png"];
[self addSubnode:_viaNode];
}
// bottom controls
_likesNode = [[LikesNode alloc] initWithLikesCount:_post.likes];
[self addSubnode:_likesNode];
_commentsNode = [[CommentsNode alloc] initWithCommentsCount:_post.comments];
[self addSubnode:_commentsNode];
_optionsNode = [[ASImageNode alloc] init];
_optionsNode.image = [UIImage imageNamed:@"icon_more"];
[self addSubnode:_optionsNode];
}
return self;
}
- (void)didLoad
{
// enable highlighting now that self.layer has loaded -- see ASHighlightOverlayLayer.h
self.layer.as_allowsHighlightDrawing = YES;
[super didLoad];
}
- (ASLayoutSpec *)layoutSpecThatFits:(ASSizeRange)constrainedSize {
//Flexible spacer between username and time
ASLayoutSpec *spacer = [[ASLayoutSpec alloc] init];
spacer.flexGrow = YES;
//Horizontal stack for name, username, via icon and time
ASStackLayoutSpec *nameStack;
//Cases with or without via icon
if(_post.via != 0) {
nameStack = [ASStackLayoutSpec stackLayoutSpecWithDirection:ASStackLayoutDirectionHorizontal spacing:5.0 justifyContent:ASStackLayoutJustifyContentStart alignItems:ASStackLayoutAlignItemsCenter children:@[_nameNode, _usernameNode, spacer, _viaNode, _timeNode]];
}else {
nameStack = [ASStackLayoutSpec stackLayoutSpecWithDirection:ASStackLayoutDirectionHorizontal spacing:5.0 justifyContent:ASStackLayoutJustifyContentStart alignItems:ASStackLayoutAlignItemsCenter children:@[_nameNode, _usernameNode, spacer, _timeNode]];
}
nameStack.alignSelf = ASStackLayoutAlignSelfStretch;
// bottom controls horizontal stack
ASStackLayoutSpec *controlsStack = [ASStackLayoutSpec stackLayoutSpecWithDirection:ASStackLayoutDirectionHorizontal spacing:10 justifyContent:ASStackLayoutJustifyContentStart alignItems:ASStackLayoutAlignItemsCenter children:@[_likesNode, _commentsNode, _optionsNode]];
//add more gaps for control line
controlsStack.spacingAfter = 3.0;
controlsStack.spacingBefore = 3.0;
NSMutableArray *mainStackContent = [[NSMutableArray alloc] init];
[mainStackContent addObject:nameStack];
[mainStackContent addObject:_postNode];
if(![_post.media isEqualToString:@""]) {
CGFloat imageRatio;
if(_mediaNode.image != nil) {
imageRatio = _mediaNode.image.size.height / _mediaNode.image.size.width;
}else {
imageRatio = 0.5;
}
ASRatioLayoutSpec *imagePlace = [ASRatioLayoutSpec ratioLayoutSpecWithRatio:imageRatio child:_mediaNode];
imagePlace.spacingAfter = 3.0;
imagePlace.spacingBefore = 3.0;
[mainStackContent addObject:imagePlace];
}
[mainStackContent addObject:controlsStack];
//Vertical spec of cell main content
ASStackLayoutSpec *contentSpec = [ASStackLayoutSpec stackLayoutSpecWithDirection:ASStackLayoutDirectionVertical spacing:8.0 justifyContent:ASStackLayoutJustifyContentStart alignItems:ASStackLayoutAlignItemsStart children:mainStackContent];
return [ASInsetLayoutSpec insetLayoutSpecWithInsets:UIEdgeInsetsMake(10, 64, 10, 10) child:contentSpec];
}
- (void)layout
{
[super layout];
// Manually layout the divider.
CGFloat pixelHeight = 1.0f / [[UIScreen mainScreen] scale];
_divider.frame = CGRectMake(0.0f, 0.0f, self.calculatedSize.width, pixelHeight);
_avatarNode.frame = CGRectMake(10, 10, 44, 44);
}
#pragma mark -
#pragma mark ASTextNodeDelegate methods.
- (BOOL)textNode:(ASTextNode *)richTextNode shouldHighlightLinkAttribute:(NSString *)attribute value:(id)value atPoint:(CGPoint)point
{
// opt into link highlighting -- tap and hold the link to try it! must enable highlighting on a layer, see -didLoad
return YES;
}
- (void)textNode:(ASTextNode *)richTextNode tappedLinkAttribute:(NSString *)attribute value:(NSURL *)URL atPoint:(CGPoint)point textRange:(NSRange)textRange
{
// the node tapped a link, open it
[[UIApplication sharedApplication] openURL:URL];
}
@end

View File

@@ -0,0 +1,22 @@
//
// TextStyles.h
// Sample
//
// Created by Vitaly Baev on 06.11.15.
// Copyright © 2015 Facebook. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface TextStyles : NSObject
+ (NSDictionary *)nameStyle;
+ (NSDictionary *)usernameStyle;
+ (NSDictionary *)timeStyle;
+ (NSDictionary *)postStyle;
+ (NSDictionary *)postLinkStyle;
+ (NSDictionary *)cellControlStyle;
+ (NSDictionary *)cellControlColoredStyle;
@end

View File

@@ -0,0 +1,70 @@
//
// TextStyles.m
// Sample
//
// Created by Vitaly Baev on 06.11.15.
// Copyright © 2015 Facebook. All rights reserved.
//
#import "TextStyles.h"
@implementation TextStyles
+ (NSDictionary *)nameStyle
{
return @{
NSFontAttributeName : [UIFont boldSystemFontOfSize:15.0],
NSForegroundColorAttributeName: [UIColor blackColor]
};
}
+ (NSDictionary *)usernameStyle
{
return @{
NSFontAttributeName : [UIFont systemFontOfSize:13.0],
NSForegroundColorAttributeName: [UIColor lightGrayColor]
};
}
+ (NSDictionary *)timeStyle
{
return @{
NSFontAttributeName : [UIFont systemFontOfSize:13.0],
NSForegroundColorAttributeName: [UIColor grayColor]
};
}
+ (NSDictionary *)postStyle
{
return @{
NSFontAttributeName : [UIFont systemFontOfSize:15.0],
NSForegroundColorAttributeName: [UIColor blackColor]
};
}
+ (NSDictionary *)postLinkStyle
{
return @{
NSFontAttributeName : [UIFont systemFontOfSize:15.0],
NSForegroundColorAttributeName: [UIColor colorWithRed:59.0/255.0 green:89.0/255.0 blue:152.0/255.0 alpha:1.0],
NSUnderlineStyleAttributeName: @(NSUnderlineStyleSingle)
};
}
+ (NSDictionary *)cellControlStyle {
return @{
NSFontAttributeName : [UIFont systemFontOfSize:13.0],
NSForegroundColorAttributeName: [UIColor lightGrayColor]
};
}
+ (NSDictionary *)cellControlColoredStyle {
return @{
NSFontAttributeName : [UIFont systemFontOfSize:13.0],
NSForegroundColorAttributeName: [UIColor colorWithRed:59.0/255.0 green:89.0/255.0 blue:152.0/255.0 alpha:1.0]
};
}
@end

View File

@@ -0,0 +1,15 @@
//
// ViewController.h
// Sample
//
// Created by Vitaly Baev on 06.11.15.
// Copyright © 2015 Facebook. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@end

View File

@@ -0,0 +1,134 @@
//
// ViewController.m
// Sample
//
// Created by Vitaly Baev on 06.11.15.
// Copyright © 2015 Facebook. All rights reserved.
//
#import "ViewController.h"
#import "Post.h"
#import "PostNode.h"
#import <AsyncDisplayKit/AsyncDisplayKit.h>
#import <AsyncDisplayKit/ASAssert.h>
#include <stdlib.h>
@interface ViewController () <ASTableViewDataSource, ASTableViewDelegate>
{
ASTableView *_tableView;
NSMutableArray *_socialAppDataSource;
}
@end
@implementation ViewController
- (instancetype)init
{
if (!(self = [super init]))
return nil;
_tableView = [[ASTableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain asyncDataFetching:YES];
_tableView.separatorStyle = UITableViewCellSeparatorStyleNone; // SocialAppNode has its own separator
_tableView.asyncDataSource = self;
_tableView.asyncDelegate = self;
[self createSocialAppDataSource];
self.title = @"Timeline";
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
[self.view addSubview:_tableView];
}
- (void)viewWillLayoutSubviews
{
_tableView.frame = self.view.bounds;
}
- (BOOL)prefersStatusBarHidden
{
return YES;
}
- (void)createSocialAppDataSource {
_socialAppDataSource = [[NSMutableArray alloc] init];
Post *newPost = [[Post alloc] init];
newPost.name = @"Apple Guy";
newPost.username = @"@appleguy";
newPost.photo = @"https://avatars1.githubusercontent.com/u/565251?v=3&s=96";
newPost.post = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.";
newPost.time = @"3s";
newPost.media = @"";
newPost.via = 0;
newPost.likes = arc4random_uniform(74);
newPost.comments = arc4random_uniform(40);
[_socialAppDataSource addObject:newPost];
newPost = [[Post alloc] init];
newPost.name = @"Huy Nguyen";
newPost.username = @"@nguyenhuy";
newPost.photo = @"https://avatars2.githubusercontent.com/u/587874?v=3&s=96";
newPost.post = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.";
newPost.time = @"1m";
newPost.media = @"";
newPost.via = 1;
newPost.likes = arc4random_uniform(74);
newPost.comments = arc4random_uniform(40);
[_socialAppDataSource addObject:newPost];
newPost = [[Post alloc] init];
newPost.name = @"Alex Long Name";
newPost.username = @"@veryyyylongusername";
newPost.photo = @"https://avatars1.githubusercontent.com/u/8086633?v=3&s=96";
newPost.post = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.";
newPost.time = @"3:02";
newPost.media = @"http://www.ngmag.ru/upload/iblock/f93/f9390efc34151456598077c1ba44a94d.jpg";
newPost.via = 2;
newPost.likes = arc4random_uniform(74);
newPost.comments = arc4random_uniform(40);
[_socialAppDataSource addObject:newPost];
newPost = [[Post alloc] init];
newPost.name = @"Vitaly Baev";
newPost.username = @"@vitalybaev";
newPost.photo = @"https://avatars0.githubusercontent.com/u/724423?v=3&s=96";
newPost.post = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. https://github.com/facebook/AsyncDisplayKit Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.";
newPost.time = @"yesterday";
newPost.media = @"";
newPost.via = 1;
newPost.likes = arc4random_uniform(74);
newPost.comments = arc4random_uniform(40);
[_socialAppDataSource addObject:newPost];
}
#pragma mark -
#pragma mark ASTableView.
- (ASCellNode *)tableView:(ASTableView *)tableView nodeForRowAtIndexPath:(NSIndexPath *)indexPath
{
Post *post = _socialAppDataSource[indexPath.row];
PostNode *node = [[PostNode alloc] initWithPost:post];
return node;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return _socialAppDataSource.count;
}
@end

Binary file not shown.

After

Width:  |  Height:  |  Size: 387 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 358 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 490 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 340 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 706 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 348 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 728 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 400 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 781 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 205 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 418 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 594 B

View File

@@ -0,0 +1,16 @@
//
// main.m
// Sample
//
// Created by Vitaly Baev on 06.11.15.
// Copyright © 2015 Facebook. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}