diff --git a/Source/ASDisplayNode.mm b/Source/ASDisplayNode.mm
index 76ad0918..472274c3 100644
--- a/Source/ASDisplayNode.mm
+++ b/Source/ASDisplayNode.mm
@@ -2787,38 +2787,34 @@ ASDISPLAYNODE_INLINE BOOL subtreeIsRasterized(ASDisplayNode *node) {
ASDisplayNodeAssert(!_flags.isEnteringHierarchy, @"ASDisplayNode inconsistency. __enterHierarchy and __exitHierarchy are mutually exclusive");
ASDisplayNodeAssertLockUnownedByCurrentThread(__instanceLock__);
- if (![self supportsRangeManagedInterfaceState]) {
- // TODO: Consider merging this codepath with the below, so both range-managed and standalone
- // nodes wait before firing their exit-visibility handlers. This is more important than it used
- // to be, as UIViewController transitions now do rehosting at both start & end of animation.
- self.interfaceState = ASInterfaceStateNone;
- } else {
- // This case is important when tearing down hierarchies. We must deliver a visibileStateDidChange:NO callback, as part our API guarantee that this method can be used for
- // things like data analytics about user content viewing. We cannot call the method in the dealloc as any incidental retain operations in client code would fail.
- // Additionally, it may be that a Standard UIView which is containing us is moving between hierarchies, and we should not send the call if we will be re-added in the
- // same runloop. Strategy: strong reference (might be the last!), wait one runloop, and confirm we are still outside the hierarchy (both layer-backed and view-backed).
- // TODO: This approach could be optimized by only performing the dispatch for root elements + recursively apply the interface state change. This would require a closer
- // integration with _ASDisplayLayer to ensure that the superlayer pointer has been cleared by this stage (to check if we are root or not), or a different delegate call.
-
- if (ASInterfaceStateIncludesVisible(_pendingInterfaceState)) {
- void(^exitVisibleInterfaceState)(void) = ^{
- // This block intentionally retains self.
- __instanceLock__.lock();
- unsigned isStillInHierarchy = _flags.isInHierarchy;
- BOOL isVisible = ASInterfaceStateIncludesVisible(_pendingInterfaceState);
- ASInterfaceState newState = (_pendingInterfaceState & ~ASInterfaceStateVisible);
- __instanceLock__.unlock();
+ // This case is important when tearing down hierarchies. We must deliver a visibileStateDidChange:NO callback, as part our API guarantee that this method can be used for
+ // things like data analytics about user content viewing. We cannot call the method in the dealloc as any incidental retain operations in client code would fail.
+ // Additionally, it may be that a Standard UIView which is containing us is moving between hierarchies, and we should not send the call if we will be re-added in the
+ // same runloop. Strategy: strong reference (might be the last!), wait one runloop, and confirm we are still outside the hierarchy (both layer-backed and view-backed).
+ // TODO: This approach could be optimized by only performing the dispatch for root elements + recursively apply the interface state change. This would require a closer
+ // integration with _ASDisplayLayer to ensure that the superlayer pointer has been cleared by this stage (to check if we are root or not), or a different delegate call.
- if (!isStillInHierarchy && isVisible) {
- self.interfaceState = newState;
- };
- };
+ if (ASInterfaceStateIncludesVisible(_pendingInterfaceState)) {
+ void(^exitVisibleInterfaceState)(void) = ^{
+ // This block intentionally retains self.
+ __instanceLock__.lock();
+ unsigned isStillInHierarchy = _flags.isInHierarchy;
+ BOOL isVisible = ASInterfaceStateIncludesVisible(_pendingInterfaceState);
+ ASInterfaceState newState = (_pendingInterfaceState & ~ASInterfaceStateVisible);
+ __instanceLock__.unlock();
- if ([[ASCATransactionQueue sharedQueue] disabled]) {
- dispatch_async(dispatch_get_main_queue(), exitVisibleInterfaceState);
- } else {
- exitVisibleInterfaceState();
+ if (!isStillInHierarchy && isVisible) {
+ if (![self supportsRangeManagedInterfaceState]) {
+ newState = ASInterfaceStateNone;
+ }
+ self.interfaceState = newState;
}
+ };
+
+ if ([[ASCATransactionQueue sharedQueue] disabled]) {
+ dispatch_async(dispatch_get_main_queue(), exitVisibleInterfaceState);
+ } else {
+ exitVisibleInterfaceState();
}
}
}
diff --git a/examples/ASViewController/Sample.xcworkspace/contents.xcworkspacedata b/examples/ASViewController/Sample.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 00000000..7b5a2f30
--- /dev/null
+++ b/examples/ASViewController/Sample.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
diff --git a/examples_extra/InterfaceCoalesceTest/Default-568h@2x.png b/examples_extra/InterfaceCoalesceTest/Default-568h@2x.png
new file mode 100644
index 00000000..6ee80b93
Binary files /dev/null and b/examples_extra/InterfaceCoalesceTest/Default-568h@2x.png differ
diff --git a/examples_extra/InterfaceCoalesceTest/Default-667h@2x.png b/examples_extra/InterfaceCoalesceTest/Default-667h@2x.png
new file mode 100644
index 00000000..e7b975e2
Binary files /dev/null and b/examples_extra/InterfaceCoalesceTest/Default-667h@2x.png differ
diff --git a/examples_extra/InterfaceCoalesceTest/Default-736h@3x.png b/examples_extra/InterfaceCoalesceTest/Default-736h@3x.png
new file mode 100644
index 00000000..c8949cae
Binary files /dev/null and b/examples_extra/InterfaceCoalesceTest/Default-736h@3x.png differ
diff --git a/examples_extra/InterfaceCoalesceTest/Podfile b/examples_extra/InterfaceCoalesceTest/Podfile
new file mode 100644
index 00000000..66700226
--- /dev/null
+++ b/examples_extra/InterfaceCoalesceTest/Podfile
@@ -0,0 +1,6 @@
+source 'https://github.com/CocoaPods/Specs.git'
+platform :ios, '8.0'
+target 'Sample' do
+ pod 'Texture/Yoga', :path => '../..'
+end
+
diff --git a/examples_extra/InterfaceCoalesceTest/Sample.xcodeproj/project.pbxproj b/examples_extra/InterfaceCoalesceTest/Sample.xcodeproj/project.pbxproj
new file mode 100644
index 00000000..86a3f35f
--- /dev/null
+++ b/examples_extra/InterfaceCoalesceTest/Sample.xcodeproj/project.pbxproj
@@ -0,0 +1,385 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 0585428019D4DBE100606EA6 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0585427F19D4DBE100606EA6 /* Default-568h@2x.png */; };
+ 05E2128719D4DB510098F589 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 05E2128619D4DB510098F589 /* main.m */; };
+ 05E2128A19D4DB510098F589 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 05E2128919D4DB510098F589 /* AppDelegate.m */; };
+ 05E2128D19D4DB510098F589 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 05E2128C19D4DB510098F589 /* ViewController.m */; };
+ 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 */
+ 0585427F19D4DBE100606EA6 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-568h@2x.png"; path = "../Default-568h@2x.png"; sourceTree = ""; };
+ 05E2128119D4DB510098F589 /* Sample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Sample.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 05E2128519D4DB510098F589 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ 05E2128619D4DB510098F589 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; };
+ 05E2128819D4DB510098F589 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; };
+ 05E2128919D4DB510098F589 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; };
+ 05E2128B19D4DB510098F589 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; };
+ 05E2128C19D4DB510098F589 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; };
+ 0CDEE995962D3E4584D302EE /* Pods-Sample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Sample.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Sample/Pods-Sample.debug.xcconfig"; sourceTree = ""; };
+ 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 = ""; };
+ C081EE8B1F85AEEC00F0B5F1 /* TabBarController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TabBarController.h; sourceTree = ""; };
+ C081EE8C1F85AEEC00F0B5F1 /* TabBarController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TabBarController.m; sourceTree = ""; };
+ C081EE8E1F85AFB800F0B5F1 /* CollectionViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CollectionViewController.h; sourceTree = ""; };
+ C081EE8F1F85AFB800F0B5F1 /* CollectionViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CollectionViewController.m; sourceTree = ""; };
+ C081EE901F85AFB800F0B5F1 /* TextCellNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextCellNode.h; sourceTree = ""; };
+ C081EE911F85AFB800F0B5F1 /* TextCellNode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TextCellNode.m; sourceTree = ""; };
+ E8EC8300ABAAEA079224272A /* libPods-Sample.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Sample.a"; sourceTree = BUILT_PRODUCTS_DIR; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 05E2127E19D4DB510098F589 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 92F1263CECFE3FFCC7A5F936 /* libPods-Sample.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 05E2127819D4DB510098F589 = {
+ isa = PBXGroup;
+ children = (
+ 05E2128319D4DB510098F589 /* Sample */,
+ 05E2128219D4DB510098F589 /* Products */,
+ 6DE0E5D094594AB09140EF84 /* Pods */,
+ F5DF5EAD6C1B97F91D1C830F /* Frameworks */,
+ );
+ indentWidth = 2;
+ sourceTree = "";
+ tabWidth = 2;
+ usesTabs = 0;
+ };
+ 05E2128219D4DB510098F589 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 05E2128119D4DB510098F589 /* Sample.app */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 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 = "";
+ };
+ 05E2128419D4DB510098F589 /* Supporting Files */ = {
+ isa = PBXGroup;
+ children = (
+ 0585427F19D4DBE100606EA6 /* Default-568h@2x.png */,
+ 6C2C82AA19EE274300767484 /* Default-667h@2x.png */,
+ 6C2C82AB19EE274300767484 /* Default-736h@3x.png */,
+ 05E2128519D4DB510098F589 /* Info.plist */,
+ 05E2128619D4DB510098F589 /* main.m */,
+ );
+ name = "Supporting Files";
+ sourceTree = "";
+ };
+ 6DE0E5D094594AB09140EF84 /* Pods */ = {
+ isa = PBXGroup;
+ children = (
+ 0CDEE995962D3E4584D302EE /* Pods-Sample.debug.xcconfig */,
+ A950870A2154F92D5DC91F1A /* Pods-Sample.release.xcconfig */,
+ );
+ name = Pods;
+ sourceTree = "";
+ };
+ F5DF5EAD6C1B97F91D1C830F /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ E8EC8300ABAAEA079224272A /* libPods-Sample.a */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 05E2128019D4DB510098F589 /* Sample */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 05E212A419D4DB510098F589 /* Build configuration list for PBXNativeTarget "Sample" */;
+ buildPhases = (
+ 77F6A2B5E8DA12933E6365CE /* [CP] Check Pods Manifest.lock */,
+ 05E2127D19D4DB510098F589 /* Sources */,
+ 05E2127E19D4DB510098F589 /* Frameworks */,
+ 05E2127F19D4DB510098F589 /* Resources */,
+ 96436DA0C1AFF84D8041B522 /* [CP] Embed Pods Frameworks */,
+ D17B5BD4AA634EFE93D71E9F /* [CP] Copy Pods Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = Sample;
+ productName = Sample;
+ productReference = 05E2128119D4DB510098F589 /* Sample.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 05E2127919D4DB510098F589 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0730;
+ ORGANIZATIONNAME = Facebook;
+ TargetAttributes = {
+ 05E2128019D4DB510098F589 = {
+ CreatedOnToolsVersion = 6.0.1;
+ };
+ };
+ };
+ buildConfigurationList = 05E2127C19D4DB510098F589 /* Build configuration list for PBXProject "Sample" */;
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 05E2127819D4DB510098F589;
+ productRefGroup = 05E2128219D4DB510098F589 /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 05E2128019D4DB510098F589 /* Sample */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 05E2127F19D4DB510098F589 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 0585428019D4DBE100606EA6 /* Default-568h@2x.png in Resources */,
+ 6C2C82AC19EE274300767484 /* Default-667h@2x.png in Resources */,
+ 6C2C82AD19EE274300767484 /* Default-736h@3x.png in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ 77F6A2B5E8DA12933E6365CE /* [CP] Check Pods Manifest.lock */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ 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_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 */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "[CP] Embed Pods Frameworks";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Sample/Pods-Sample-frameworks.sh\"\n";
+ showEnvVarsInLog = 0;
+ };
+ D17B5BD4AA634EFE93D71E9F /* [CP] Copy Pods Resources */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "[CP] Copy Pods Resources";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Sample/Pods-Sample-resources.sh\"\n";
+ showEnvVarsInLog = 0;
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 05E2127D19D4DB510098F589 /* Sources */ = {
+ 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;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+ 05E212A219D4DB510098F589 /* 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;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ 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 = 8.0;
+ MTL_ENABLE_DEBUG_INFO = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ };
+ name = Debug;
+ };
+ 05E212A319D4DB510098F589 /* 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 = YES;
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ 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 = 8.0;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = iphoneos;
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Release;
+ };
+ 05E212A519D4DB510098F589 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 0CDEE995962D3E4584D302EE /* Pods-Sample.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.$(PRODUCT_NAME:rfc1034identifier)";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ 05E212A619D4DB510098F589 /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = A950870A2154F92D5DC91F1A /* Pods-Sample.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.$(PRODUCT_NAME:rfc1034identifier)";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 05E2127C19D4DB510098F589 /* Build configuration list for PBXProject "Sample" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 05E212A219D4DB510098F589 /* Debug */,
+ 05E212A319D4DB510098F589 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 05E212A419D4DB510098F589 /* Build configuration list for PBXNativeTarget "Sample" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 05E212A519D4DB510098F589 /* Debug */,
+ 05E212A619D4DB510098F589 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 05E2127919D4DB510098F589 /* Project object */;
+}
diff --git a/examples_extra/InterfaceCoalesceTest/Sample.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/examples_extra/InterfaceCoalesceTest/Sample.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 00000000..919434a6
--- /dev/null
+++ b/examples_extra/InterfaceCoalesceTest/Sample.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/examples_extra/InterfaceCoalesceTest/Sample.xcodeproj/xcshareddata/xcschemes/Sample.xcscheme b/examples_extra/InterfaceCoalesceTest/Sample.xcodeproj/xcshareddata/xcschemes/Sample.xcscheme
new file mode 100644
index 00000000..d41d58c5
--- /dev/null
+++ b/examples_extra/InterfaceCoalesceTest/Sample.xcodeproj/xcshareddata/xcschemes/Sample.xcscheme
@@ -0,0 +1,91 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples_extra/InterfaceCoalesceTest/Sample.xcworkspace/contents.xcworkspacedata b/examples_extra/InterfaceCoalesceTest/Sample.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 00000000..7b5a2f30
--- /dev/null
+++ b/examples_extra/InterfaceCoalesceTest/Sample.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
diff --git a/examples_extra/InterfaceCoalesceTest/Sample/AppDelegate.h b/examples_extra/InterfaceCoalesceTest/Sample/AppDelegate.h
new file mode 100644
index 00000000..2aa29369
--- /dev/null
+++ b/examples_extra/InterfaceCoalesceTest/Sample/AppDelegate.h
@@ -0,0 +1,18 @@
+/* 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.
+ */
+
+#import
+
+@interface AppDelegate : UIResponder
+
+@property (strong, nonatomic) UIWindow *window;
+
+@end
diff --git a/examples_extra/InterfaceCoalesceTest/Sample/AppDelegate.m b/examples_extra/InterfaceCoalesceTest/Sample/AppDelegate.m
new file mode 100644
index 00000000..7b8d54bd
--- /dev/null
+++ b/examples_extra/InterfaceCoalesceTest/Sample/AppDelegate.m
@@ -0,0 +1,39 @@
+//
+// 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 "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];
+
+ ViewController *viewController = [[ViewController alloc] init];
+// viewController.tabBarItem.title = @"TextStress";
+
+
+
+// TabBarController *tabBarController = [[TabBarController alloc] init];
+// tabBarController.viewControllers = @[cvc, viewController];
+ UINavigationController *nvc = [[UINavigationController alloc] initWithRootViewController:viewController];
+ self.window.rootViewController = nvc;
+ [self.window makeKeyAndVisible];
+ return YES;
+}
+
+@end
diff --git a/examples_extra/InterfaceCoalesceTest/Sample/CollectionViewController.h b/examples_extra/InterfaceCoalesceTest/Sample/CollectionViewController.h
new file mode 100644
index 00000000..159b2fa1
--- /dev/null
+++ b/examples_extra/InterfaceCoalesceTest/Sample/CollectionViewController.h
@@ -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
+#import
+
+@interface CollectionViewController : ASViewController
+@end
diff --git a/examples_extra/InterfaceCoalesceTest/Sample/CollectionViewController.m b/examples_extra/InterfaceCoalesceTest/Sample/CollectionViewController.m
new file mode 100644
index 00000000..d9300523
--- /dev/null
+++ b/examples_extra/InterfaceCoalesceTest/Sample/CollectionViewController.m
@@ -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()
+{
+ ASCollectionNode *_collectionNode;
+ NSArray *_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
diff --git a/examples_extra/InterfaceCoalesceTest/Sample/Info.plist b/examples_extra/InterfaceCoalesceTest/Sample/Info.plist
new file mode 100644
index 00000000..fb4115c8
--- /dev/null
+++ b/examples_extra/InterfaceCoalesceTest/Sample/Info.plist
@@ -0,0 +1,36 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ en
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ 1.0
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ 1
+ LSRequiresIPhoneOS
+
+ UIRequiredDeviceCapabilities
+
+ armv7
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+
+
diff --git a/examples_extra/InterfaceCoalesceTest/Sample/TabBarController.h b/examples_extra/InterfaceCoalesceTest/Sample/TabBarController.h
new file mode 100644
index 00000000..5a25bb04
--- /dev/null
+++ b/examples_extra/InterfaceCoalesceTest/Sample/TabBarController.h
@@ -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
+
+@interface TabBarController : ASTabBarController
+@end
diff --git a/examples_extra/InterfaceCoalesceTest/Sample/TabBarController.m b/examples_extra/InterfaceCoalesceTest/Sample/TabBarController.m
new file mode 100644
index 00000000..a7905cb2
--- /dev/null
+++ b/examples_extra/InterfaceCoalesceTest/Sample/TabBarController.m
@@ -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
diff --git a/examples_extra/InterfaceCoalesceTest/Sample/TextCellNode.h b/examples_extra/InterfaceCoalesceTest/Sample/TextCellNode.h
new file mode 100644
index 00000000..c4b35cfa
--- /dev/null
+++ b/examples_extra/InterfaceCoalesceTest/Sample/TextCellNode.h
@@ -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
+
+@interface TextCellNode : ASCellNode
+- (instancetype)initWithText1:(NSString *)text1 text2:(NSString *)text2;
+@end
diff --git a/examples_extra/InterfaceCoalesceTest/Sample/TextCellNode.m b/examples_extra/InterfaceCoalesceTest/Sample/TextCellNode.m
new file mode 100644
index 00000000..13bb7694
--- /dev/null
+++ b/examples_extra/InterfaceCoalesceTest/Sample/TextCellNode.m
@@ -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
+#import
+
+#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
diff --git a/examples_extra/InterfaceCoalesceTest/Sample/ViewController.h b/examples_extra/InterfaceCoalesceTest/Sample/ViewController.h
new file mode 100644
index 00000000..d0e9200d
--- /dev/null
+++ b/examples_extra/InterfaceCoalesceTest/Sample/ViewController.h
@@ -0,0 +1,16 @@
+/* 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.
+ */
+
+#import
+
+@interface ViewController : UIViewController
+
+@end
diff --git a/examples_extra/InterfaceCoalesceTest/Sample/ViewController.m b/examples_extra/InterfaceCoalesceTest/Sample/ViewController.m
new file mode 100644
index 00000000..8968fadd
--- /dev/null
+++ b/examples_extra/InterfaceCoalesceTest/Sample/ViewController.m
@@ -0,0 +1,47 @@
+/* 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.
+ */
+
+#import "ViewController.h"
+#import
+
+#define NUMBER_ELEMENTS 2
+
+@interface ViewController ()
+{
+ ASButtonNode *_node;
+}
+
+@end
+
+
+@implementation ViewController
+
++(void)initialize {
+ [[ASCATransactionQueue sharedQueue] disableInterfaceStateCoalesce];
+}
+- (void)viewDidLoad
+{
+ [super viewDidLoad];
+
+ _node = [[ASButtonNode alloc] init];
+ _node.frame = CGRectMake(0, 100, 100, 100);
+ _node.backgroundColor = [UIColor greenColor];
+
+ [self.view addSubnode:_node];
+ [_node addTarget:self action:@selector(clicked:) forControlEvents:ASControlNodeEventTouchUpInside];
+}
+
+- (void)clicked:(id)sender {
+ ViewController *vc = [[ViewController alloc] init];
+ [self.navigationController pushViewController:vc animated:YES];
+}
+
+@end
diff --git a/examples_extra/InterfaceCoalesceTest/Sample/main.m b/examples_extra/InterfaceCoalesceTest/Sample/main.m
new file mode 100644
index 00000000..ae948871
--- /dev/null
+++ b/examples_extra/InterfaceCoalesceTest/Sample/main.m
@@ -0,0 +1,20 @@
+/* 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.
+ */
+
+#import
+
+#import "AppDelegate.h"
+
+int main(int argc, char * argv[]) {
+ @autoreleasepool {
+ return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
+ }
+}