From d27c8859c7cd4050eaa42a0850b1aefce13b1d60 Mon Sep 17 00:00:00 2001 From: Ryan Nystrom Date: Wed, 3 Dec 2014 10:17:48 -0800 Subject: [PATCH] Node placeholder API ASDisplayNodes now have an overidable method -placeholderImage that lets you provide a custom UIImage to display while a node is displaying asyncronously. The default implementation of this method returns nil and thus does nothing. A provided example project also demonstrates using the placeholder API. --- AsyncDisplayKit/ASDisplayNode+Subclasses.h | 38 ++ AsyncDisplayKit/ASDisplayNode.h | 8 + AsyncDisplayKit/ASDisplayNode.mm | 117 +++++- AsyncDisplayKit/ASDisplayNodeExtras.h | 2 + AsyncDisplayKit/ASDisplayNodeExtras.mm | 9 + AsyncDisplayKit/ASImageNode.h | 5 + AsyncDisplayKit/ASImageNode.mm | 10 + AsyncDisplayKit/ASTextNode.h | 12 + AsyncDisplayKit/ASTextNode.mm | 43 ++ .../Private/ASDisplayNodeInternal.h | 6 + examples/Kittens/Sample/KittenNode.m | 2 +- examples/Placeholders/Default-568h@2x.png | Bin 0 -> 17520 bytes examples/Placeholders/Default-667h@2x.png | Bin 0 -> 18314 bytes examples/Placeholders/Default-736h@3x.png | Bin 0 -> 23380 bytes examples/Placeholders/Podfile | 3 + .../Sample.xcodeproj/project.pbxproj | 372 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../contents.xcworkspacedata | 1 + examples/Placeholders/Sample/AppDelegate.h | 18 + examples/Placeholders/Sample/AppDelegate.m | 27 ++ examples/Placeholders/Sample/Info.plist | 36 ++ examples/Placeholders/Sample/PostNode.h | 16 + examples/Placeholders/Sample/PostNode.m | 88 +++++ .../Placeholders/Sample/SlowpokeImageNode.h | 16 + .../Placeholders/Sample/SlowpokeImageNode.m | 65 +++ .../Placeholders/Sample/SlowpokeShareNode.h | 16 + .../Placeholders/Sample/SlowpokeShareNode.m | 43 ++ .../Placeholders/Sample/SlowpokeTextNode.h | 16 + .../Placeholders/Sample/SlowpokeTextNode.m | 25 ++ examples/Placeholders/Sample/ViewController.h | 16 + examples/Placeholders/Sample/ViewController.m | 105 +++++ examples/Placeholders/Sample/logo.png | Bin 0 -> 105684 bytes examples/Placeholders/Sample/main.m | 20 + 33 files changed, 1140 insertions(+), 2 deletions(-) create mode 100644 examples/Placeholders/Default-568h@2x.png create mode 100644 examples/Placeholders/Default-667h@2x.png create mode 100644 examples/Placeholders/Default-736h@3x.png create mode 100644 examples/Placeholders/Podfile create mode 100644 examples/Placeholders/Sample.xcodeproj/project.pbxproj create mode 100644 examples/Placeholders/Sample.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 examples/Placeholders/Sample.xcworkspace/contents.xcworkspacedata create mode 100644 examples/Placeholders/Sample/AppDelegate.h create mode 100644 examples/Placeholders/Sample/AppDelegate.m create mode 100644 examples/Placeholders/Sample/Info.plist create mode 100644 examples/Placeholders/Sample/PostNode.h create mode 100644 examples/Placeholders/Sample/PostNode.m create mode 100644 examples/Placeholders/Sample/SlowpokeImageNode.h create mode 100644 examples/Placeholders/Sample/SlowpokeImageNode.m create mode 100644 examples/Placeholders/Sample/SlowpokeShareNode.h create mode 100644 examples/Placeholders/Sample/SlowpokeShareNode.m create mode 100644 examples/Placeholders/Sample/SlowpokeTextNode.h create mode 100644 examples/Placeholders/Sample/SlowpokeTextNode.m create mode 100644 examples/Placeholders/Sample/ViewController.h create mode 100644 examples/Placeholders/Sample/ViewController.m create mode 100755 examples/Placeholders/Sample/logo.png create mode 100644 examples/Placeholders/Sample/main.m diff --git a/AsyncDisplayKit/ASDisplayNode+Subclasses.h b/AsyncDisplayKit/ASDisplayNode+Subclasses.h index cf4fc08d4d..f551639afe 100644 --- a/AsyncDisplayKit/ASDisplayNode+Subclasses.h +++ b/AsyncDisplayKit/ASDisplayNode+Subclasses.h @@ -185,6 +185,24 @@ */ - (void)displayDidFinish ASDISPLAYNODE_REQUIRES_SUPER; +/** + * @abstract Indicates that the receiver is about to display its subnodes. This method is not called if there are no + * subnodes present. + * + * @discussion Subclasses may override this method to be notified when subnode display (asynchronous or synchronous) is + * about to begin. + */ +- (void)subnodeDisplayWillStart:(ASDisplayNode *)subnode ASDISPLAYNODE_REQUIRES_SUPER; + +/** + * @abstract Indicates that the receiver is finished displaying its subnodes. This method is not called if there are + * no subnodes present. + * + * @discussion Subclasses may override this method to be notified when subnode display (asynchronous or synchronous) is + * about to begin. + */ +- (void)subnodeDisplayDidFinish:(ASDisplayNode *)subnode ASDISPLAYNODE_REQUIRES_SUPER; + /** * @abstract Marks the receiver's bounds as needing to be redrawn, with a scale value. @@ -303,6 +321,26 @@ - (void)reclaimMemory ASDISPLAYNODE_REQUIRES_SUPER; +/** @name Placeholders */ + +/** + * @abstract Optionally provide an image to serve as the placeholder for the backing store while the contents are being + * displayed. + * + * @discussion + * Subclasses may override this method and return an image to use as the placeholder. Take caution as there may be a + * time and place where this method is called on a background thread. Note that -[UIImage imageNamed:] is not thread + * safe when using image assets. + * + * To retrieve the CGSize to do any image drawing, use the node's calculatedSize property. + * + * Defaults to nil. + * + * @note Called on the display queue and/or main queue (MUST BE THREAD SAFE) + */ +- (UIImage *)placeholderImage; + + /** @name Description */ diff --git a/AsyncDisplayKit/ASDisplayNode.h b/AsyncDisplayKit/ASDisplayNode.h index bf72daf2be..997ae4ff63 100644 --- a/AsyncDisplayKit/ASDisplayNode.h +++ b/AsyncDisplayKit/ASDisplayNode.h @@ -330,6 +330,14 @@ - (void)recursivelyReclaimMemory; +/** + * @abstract Toggle displaying a placeholder over the node that covers content until the node and all subnodes are + * displayed. + * + * @discussion Defaults to NO. + */ +@property (nonatomic, assign) BOOL placeholderEnabled; + /** @name Hit Testing */ diff --git a/AsyncDisplayKit/ASDisplayNode.mm b/AsyncDisplayKit/ASDisplayNode.mm index 3880474ad5..690f6a73f9 100644 --- a/AsyncDisplayKit/ASDisplayNode.mm +++ b/AsyncDisplayKit/ASDisplayNode.mm @@ -184,6 +184,8 @@ void ASDisplayNodePerformBlockOnMainThread(void (^block)()) _replaceAsyncSentinel = nil; _displaySentinel = nil; + + _pendingDisplayNodes = nil; } #pragma mark - UIResponder overrides @@ -270,6 +272,10 @@ void ASDisplayNodePerformBlockOnMainThread(void (^block)()) TIME_SCOPED(_debugTimeForDidLoad); [self didLoad]; } + + if (self.placeholderEnabled) { + [self _setupPlaceholderLayer]; + } } - (UIView *)view @@ -349,6 +355,7 @@ void ASDisplayNodePerformBlockOnMainThread(void (^block)()) - (CGSize)measure:(CGSize)constrainedSize { ASDisplayNodeAssertThreadAffinity(self); + ASDN::MutexLocker l(_propertyLock); if (![self __shouldSize]) return CGSizeZero; @@ -365,6 +372,18 @@ void ASDisplayNodePerformBlockOnMainThread(void (^block)()) ASDisplayNodeAssertTrue(_size.width >= 0.0); ASDisplayNodeAssertTrue(_size.height >= 0.0); + + // we generate placeholders at measure: time so that a node is guaranteed to have a placeholder ready to go + if (self.placeholderEnabled && [self displaysAsynchronously]) { + if (!_placeholderImage) { + _placeholderImage = [self placeholderImage]; + } + + if (_placeholderLayer) { + _placeholderLayer.contents = (id)_placeholderImage.CGImage; + } + } + return _size; } @@ -448,8 +467,10 @@ void ASDisplayNodePerformBlockOnMainThread(void (^block)()) { ASDisplayNodeAssertMainThread(); ASDN::MutexLocker l(_propertyLock); - if (CGRectEqualToRect(_layer.bounds, CGRectZero)) + if (CGRectEqualToRect(_layer.bounds, CGRectZero)) { return; // Performing layout on a zero-bounds view often results in frame calculations with negative sizes after applying margins, which will cause measure: on subnodes to assert. + } + _placeholderLayer.frame = _layer.bounds; [self layout]; [self layoutDidFinish]; } @@ -1091,6 +1112,60 @@ static NSInteger incrementIfFound(NSInteger i) { _supernode = supernode; } +// Track that a node will be displayed as part of the current node hierarchy. +// The node sending the message should usually be passed as the parameter, similar to the delegation pattern. +- (void)_pendingNodeWillDisplay:(ASDisplayNode *)node +{ + ASDN::MutexLocker l(_propertyLock); + + [_pendingDisplayNodes addObject:node]; +} + +// Notify that a node that was pending display finished +// The node sending the message should usually be passed as the parameter, similar to the delegation pattern. +- (void)_pendingNodeDidDisplay:(ASDisplayNode *)node +{ + ASDN::MutexLocker l(_propertyLock); + + [_pendingDisplayNodes removeObject:node]; + + // only trampoline if there is a placeholder and nodes are done displaying + if ([self _pendingDisplayNodesHaveFinished] && _placeholderLayer.superlayer) { + dispatch_async(dispatch_get_main_queue(), ^{ + [self _tearDownPlaceholderLayer]; + }); + } +} + +// Helper method to check that all nodes that the current node is waiting to display are finished +// Use this method to check to remove any placeholder layers +- (BOOL)_pendingDisplayNodesHaveFinished +{ + return _pendingDisplayNodes.count == 0; +} + +// Helper method to summarize whether or not the node run through the display process +- (BOOL)_implementsDisplay +{ + return _flags.implementsDrawRect == YES || _flags.implementsImageDisplay == YES; +} + +- (void)_setupPlaceholderLayer +{ + ASDisplayNodeAssertMainThread(); + + _placeholderLayer = [CALayer layer]; + // do not set to CGFLOAT_MAX in the case that something needs to be overtop the placeholder + _placeholderLayer.zPosition = 9999.0; +} + +- (void)_tearDownPlaceholderLayer +{ + ASDisplayNodeAssertMainThread(); + + [_placeholderLayer removeFromSuperlayer]; +} + #pragma mark - For Subclasses - (CGSize)calculateSizeThatFits:(CGSize)constrainedSize @@ -1111,6 +1186,11 @@ static NSInteger incrementIfFound(NSInteger i) { return _constrainedSize; } +- (UIImage *)placeholderImage +{ + return nil; +} + - (void)invalidateCalculatedSize { ASDisplayNodeAssertThreadAffinity(self); @@ -1142,6 +1222,7 @@ static NSInteger incrementIfFound(NSInteger i) { - (void)reclaimMemory { self.layer.contents = nil; + _placeholderLayer.contents = nil; } - (void)recursivelyReclaimMemory @@ -1159,10 +1240,36 @@ static NSInteger incrementIfFound(NSInteger i) { - (void)displayWillStart { + // in case current node takes longer to display than it's subnodes, treat it as a dependent node + [self _pendingNodeWillDisplay:self]; + + [_supernode subnodeDisplayWillStart:self]; + + if (_placeholderImage && _placeholderLayer) { + _placeholderLayer.contents = (id)_placeholderImage.CGImage; + [self.layer addSublayer:_placeholderLayer]; + } } - (void)displayDidFinish { + [self _pendingNodeDidDisplay:self]; + + [_supernode subnodeDisplayDidFinish:self]; + + if (_placeholderLayer && [self _pendingDisplayNodesHaveFinished]) { + [self _tearDownPlaceholderLayer]; + } +} + +- (void)subnodeDisplayWillStart:(ASDisplayNode *)subnode +{ + [self _pendingNodeWillDisplay:subnode]; +} + +- (void)subnodeDisplayDidFinish:(ASDisplayNode *)subnode +{ + [self _pendingNodeDidDisplay:subnode]; } - (void)setNeedsDisplayAtScale:(CGFloat)contentsScale @@ -1394,6 +1501,14 @@ static void _recursivelySetDisplaySuspended(ASDisplayNode *node, CALayer *layer, _flags.displaySuspended = flag; self.asyncLayer.displaySuspended = flag; + + if ([self _implementsDisplay]) { + if (flag) { + [_supernode subnodeDisplayDidFinish:self]; + } else { + [_supernode subnodeDisplayWillStart:self]; + } + } } - (BOOL)isInHierarchy diff --git a/AsyncDisplayKit/ASDisplayNodeExtras.h b/AsyncDisplayKit/ASDisplayNodeExtras.h index 8adaf3ca63..bb042be975 100644 --- a/AsyncDisplayKit/ASDisplayNodeExtras.h +++ b/AsyncDisplayKit/ASDisplayNodeExtras.h @@ -59,6 +59,8 @@ extern id ASDisplayNodeFindFirstSubnode(ASDisplayNode *start, BOOL (^block)(ASDi */ extern id ASDisplayNodeFindFirstSubnodeOfClass(ASDisplayNode *start, Class c); +extern UIColor *ASDisplayNodeDefaultPlaceholderColor(); + /** Disable willAppear / didAppear / didDisappear notifications for a sub-hierarchy, then re-enable when done. Nested calls are supported. */ diff --git a/AsyncDisplayKit/ASDisplayNodeExtras.mm b/AsyncDisplayKit/ASDisplayNodeExtras.mm index 4849de7414..b8a4c1a4eb 100644 --- a/AsyncDisplayKit/ASDisplayNodeExtras.mm +++ b/AsyncDisplayKit/ASDisplayNodeExtras.mm @@ -122,6 +122,15 @@ extern id ASDisplayNodeFindFirstSubnodeOfClass(ASDisplayNode *start, Class c) }); } +#pragma mark - Placeholders + +UIColor *ASDisplayNodeDefaultPlaceholderColor() +{ + return [UIColor colorWithWhite:0.95 alpha:1.0]; +} + +#pragma mark - Hierarchy Notifications + void ASDisplayNodeDisableHierarchyNotifications(ASDisplayNode *node) { [node __incrementVisibilityNotificationsDisabled]; diff --git a/AsyncDisplayKit/ASImageNode.h b/AsyncDisplayKit/ASImageNode.h index d4c0ae102c..c4b6686933 100644 --- a/AsyncDisplayKit/ASImageNode.h +++ b/AsyncDisplayKit/ASImageNode.h @@ -53,6 +53,11 @@ typedef UIImage *(^asimagenode_modification_block_t)(UIImage *image); */ @property (nonatomic, assign) ASImageNodeTint tint; +/** + @abstract The placeholder color. + */ +@property (nonatomic, strong) UIColor *placeholderColor; + /** * @abstract Indicates whether efficient cropping of the receiver is enabled. * diff --git a/AsyncDisplayKit/ASImageNode.mm b/AsyncDisplayKit/ASImageNode.mm index 7f19f17567..d8a7be58b4 100644 --- a/AsyncDisplayKit/ASImageNode.mm +++ b/AsyncDisplayKit/ASImageNode.mm @@ -13,6 +13,7 @@ #import #import #import +#import #import "ASImageNode+CGExtras.h" @@ -91,6 +92,7 @@ _cropEnabled = YES; _cropRect = CGRectMake(0.5, 0.5, 0, 0); _cropDisplayBounds = CGRectNull; + _placeholderColor = ASDisplayNodeDefaultPlaceholderColor(); return self; } @@ -139,6 +141,14 @@ return _tint; } +- (void)setPlaceholderColor:(UIColor *)placeholderColor +{ + _placeholderColor = placeholderColor; + + // prevent placeholders if we don't have a color + self.placeholderEnabled = placeholderColor != nil; +} + - (NSObject *)drawParametersForAsyncLayer:(_ASDisplayLayer *)layer; { BOOL hasValidCropBounds = _cropEnabled && !CGRectIsNull(_cropDisplayBounds) && !CGRectIsEmpty(_cropDisplayBounds); diff --git a/AsyncDisplayKit/ASTextNode.h b/AsyncDisplayKit/ASTextNode.h index 371cc33fca..a3c2b7554a 100644 --- a/AsyncDisplayKit/ASTextNode.h +++ b/AsyncDisplayKit/ASTextNode.h @@ -69,6 +69,18 @@ typedef NS_ENUM(NSUInteger, ASTextNodeHighlightStyle) { */ @property (nonatomic, readonly, assign) NSUInteger lineCount; +#pragma mark - Placeholders + +/** + @abstract The placeholder color. + */ +@property (nonatomic, strong) UIColor *placeholderColor; + +/** + @abstract Inset each line of the placeholder. + */ +@property (nonatomic, assign) UIEdgeInsets placeholderInsets; + #pragma mark - Shadow /** diff --git a/AsyncDisplayKit/ASTextNode.mm b/AsyncDisplayKit/ASTextNode.mm index c017eda023..c8170154d0 100644 --- a/AsyncDisplayKit/ASTextNode.mm +++ b/AsyncDisplayKit/ASTextNode.mm @@ -14,6 +14,7 @@ #import #import #import +#import #import "ASTextNodeRenderer.h" #import "ASTextNodeShadower.h" @@ -135,6 +136,11 @@ ASDISPLAYNODE_INLINE CGFloat ceilPixelValue(CGFloat f) self.accessibilityTraits = UIAccessibilityTraitStaticText; _constrainedSize = CGSizeMake(-INFINITY, -INFINITY); + + // Placeholders + self.placeholderEnabled = YES; + _placeholderColor = ASDisplayNodeDefaultPlaceholderColor(); + _placeholderInsets = UIEdgeInsetsMake(1.0, 0.0, 1.0, 0.0); } return self; @@ -666,6 +672,43 @@ ASDISPLAYNODE_INLINE CGFloat ceilPixelValue(CGFloat f) return [self.class _adjustRendererRect:frame forShadowPadding:self.shadowPadding]; } +#pragma mark - Placeholders + +- (void)setPlaceholderColor:(UIColor *)placeholderColor +{ + _placeholderColor = placeholderColor; + + // prevent placeholders if we don't have a color + self.placeholderEnabled = placeholderColor != nil; +} + +- (UIImage *)placeholderImage +{ + CGSize size = self.calculatedSize; + UIGraphicsBeginImageContext(size); + [self.placeholderColor setFill]; + + ASTextNodeRenderer *renderer = [self _renderer]; + NSRange textRange = [renderer visibleRange]; + + // cap height is both faster and creates less subpixel blending + NSArray *lineRects = [self _rectsForTextRange:textRange measureOption:ASTextNodeRendererMeasureOptionLineHeight]; + + // fill each line with the placeholder color + for (NSValue *rectValue in lineRects) { + CGRect lineRect = [rectValue CGRectValue]; + CGRect fillBounds = UIEdgeInsetsInsetRect(lineRect, self.placeholderInsets); + + if (fillBounds.size.width > 0.0 && fillBounds.size.height > 0.0) { + UIRectFill(fillBounds); + } + } + + UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + return image; +} + #pragma mark - Touch Handling - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event diff --git a/AsyncDisplayKit/Private/ASDisplayNodeInternal.h b/AsyncDisplayKit/Private/ASDisplayNodeInternal.h index 7081b0c07d..2995caab2b 100644 --- a/AsyncDisplayKit/Private/ASDisplayNodeInternal.h +++ b/AsyncDisplayKit/Private/ASDisplayNodeInternal.h @@ -53,6 +53,12 @@ void ASDisplayNodePerformBlockOnMainThread(void (^block)()); UIView *_view; CALayer *_layer; + UIImage *_placeholderImage; + CALayer *_placeholderLayer; + + // keeps track of nodes/subnodes that have not finished display, used with placeholders + NSMutableSet *_pendingDisplayNodes; + _ASPendingState *_pendingViewState; struct { diff --git a/examples/Kittens/Sample/KittenNode.m b/examples/Kittens/Sample/KittenNode.m index 34d02c8bf4..27d305b00f 100644 --- a/examples/Kittens/Sample/KittenNode.m +++ b/examples/Kittens/Sample/KittenNode.m @@ -75,7 +75,7 @@ static const CGFloat kInnerPadding = 10.0f; // kitten image, with a purple background colour serving as placeholder _imageNode = [[ASNetworkImageNode alloc] init]; - _imageNode.backgroundColor = [UIColor purpleColor]; + _imageNode.backgroundColor = ASDisplayNodeDefaultPlaceholderColor(); _imageNode.URL = [NSURL URLWithString:[NSString stringWithFormat:@"http://placekitten.com/%zd/%zd", (NSInteger)roundl(_kittenSize.width), (NSInteger)roundl(_kittenSize.height)]]; diff --git a/examples/Placeholders/Default-568h@2x.png b/examples/Placeholders/Default-568h@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6ee80b93937cd9dd79502629b14fe09aa03cacc2 GIT binary patch literal 17520 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 E06EB-U;qFB literal 0 HcmV?d00001 diff --git a/examples/Placeholders/Default-736h@3x.png b/examples/Placeholders/Default-736h@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8949cae16a4217842bd8ad813422c6b02e7cafa GIT binary patch literal 23380 zcmeI3&2QsG7{;dvp`~agBn}`rU}c2_5{^Co*u*CBswBI#5^1Zpi0)~3Y)@Ki6WiGC zChY|TCvFHXE5u>%NL;wV0fEGo^J@PC5E5KCaDuU&4|kFdg zdhMfNZ$I1by=i;VuulBQrS}<*{ybMEgw+Y z?`=z+D4~*BH)T)7hSad?*u+K?zba`e))iG(ur6cGRxKNw(&STfR@qT2@%#2p_u6DQ z7PV`KSr*%hG8&EQBfTCa2MV?4Y7lsEkRh;JT_T6Zzgu6CWjm;?#Ukp#wUkVU{u-UaE@^ zqby1fqcet_rOzCg%}K8}8++;b4u?yJPP41G8G;GYrOI^gIHt-DO{1g4qgQXUOS!b{ z>a(CfpPW-pdFIS>r{mxZS)M6n#Zo9|sKu_;?j)3CQL-0B1E*YN+f#&6rz5@GBVG{Z zNMC6weE<1m&#h>eWYl4c(U7q!V`EQKZH#RestsFJD<)-6&Z8IkLH~G(hhf@Aqv}!V z$$PNP%ca`4;^TXEKT3uqbAll`ph_Gbw3K;crRQu(*_~(*CG51Qqqmf0%@tL# z%OtV!#5ekuMW}3fo+cYjqbZZ7=E~GCvFmv%we)@gvDd507p%LH zca(3HiM7wHU9)NG4c*OMb=lB-OLlervW%Ms#tqVRUEP{mSL6%UTS>sm92r#lFw}aGvc-8^S+s2F7KLn=zH_>DnivE{L5fL|(tNwMYt#KUt6;MNm1~M^YZEUo zWsaBc2I{wzQ?2vUnkgr;U~vM^N4fN`$j=^QbVx(dhAOR!UT2%6Q9m1zgsvU1HSw1l zy|g^7;k{c*UiSyVzc33ax&2^sKn+c6P*;_G^K!n@JzsX48kQ}r_EkzOqv5;LIsT_} zU}&~ED@gy*9L(3RcSynm>O0ExvZf7>(zKng_C46vIdva-)Tgc7gQrX3w1O{|&Q|{L zV6(EzN&qR!9d0QLZSw_F_TSIT=isR5-_TU{QE>i$BCV!*>25)XkQ{H}i_^U`z-5-GJRH)BFa2HG_>+sQA=U>Gio()6`~F zT1ic$<#bgZor~I8wz3Cv_M1SN{U}%{tFv3r!#tQ@)5CP-ykHOxh&TjXVm@3JaB)Dy zA>b18;j(~>10oIqmzWQi1za2uaR|7?e7G#&;(&-lz$NCxWdRolL>vMxF&{1qxHur< z5O9h4a9O~`0TG9QOU#GM0xk}SI0Rf`K3o=XaX`c&;1cuUvVe;NA`StUm=Bi)TpSQ_ z2)M+2xGdn}fQUoDCFa9r0T%~E90D#eA1({HI3VH>aEbYFS-`~s5r=?F%!kVYE)Iw| z1YBZ1To!O~K*S;767%7*fQthn4gr^#50?d891w9R#I-tq&6bAj-P#d*iT2)B=M(k< zuH>!n^bk6E38D8sKf00e*l5C8%|00;m9AOHk_01yBIKmZ5;0U!VbfB+Bx0zd!= l00AHX1c1Q*gn;t`y7MJkdHVCOto({Mu5Na}c>U)4e*&NtopJyG literal 0 HcmV?d00001 diff --git a/examples/Placeholders/Podfile b/examples/Placeholders/Podfile new file mode 100644 index 0000000000..6c012e3c04 --- /dev/null +++ b/examples/Placeholders/Podfile @@ -0,0 +1,3 @@ +source 'https://github.com/CocoaPods/Specs.git' +platform :ios, '8.0' +pod 'AsyncDisplayKit', :path => '../..' diff --git a/examples/Placeholders/Sample.xcodeproj/project.pbxproj b/examples/Placeholders/Sample.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..0749dfd00c --- /dev/null +++ b/examples/Placeholders/Sample.xcodeproj/project.pbxproj @@ -0,0 +1,372 @@ +// !$*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 */; }; + 29A7F3A51A3638DE00CF34F2 /* SlowpokeTextNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 29A7F3A41A3638DE00CF34F2 /* SlowpokeTextNode.m */; }; + 29E35E9B1A2F8DB0007B4B17 /* SlowpokeImageNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 29E35E9A1A2F8DB0007B4B17 /* SlowpokeImageNode.m */; }; + 29E35E9E1A2F8DBC007B4B17 /* SlowpokeShareNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 29E35E9D1A2F8DBC007B4B17 /* SlowpokeShareNode.m */; }; + 29E35EA01A2F9650007B4B17 /* logo.png in Resources */ = {isa = PBXBuildFile; fileRef = 29E35E9F1A2F9650007B4B17 /* logo.png */; }; + 29E35EA31A2FD0E9007B4B17 /* PostNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 29E35EA21A2FD0E9007B4B17 /* PostNode.m */; }; + 3EC0CDCBA10D483D9F386E5E /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3D24B17D1E4A4E7A9566C5E9 /* libPods.a */; }; + 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 */; }; +/* 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 = ""; }; + 088AA6578212BE9BFBB07B70 /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = "Pods/Target Support Files/Pods/Pods.release.xcconfig"; sourceTree = ""; }; + 29A7F3A31A3638DE00CF34F2 /* SlowpokeTextNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SlowpokeTextNode.h; sourceTree = ""; }; + 29A7F3A41A3638DE00CF34F2 /* SlowpokeTextNode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SlowpokeTextNode.m; sourceTree = ""; }; + 29E35E991A2F8DB0007B4B17 /* SlowpokeImageNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SlowpokeImageNode.h; sourceTree = ""; }; + 29E35E9A1A2F8DB0007B4B17 /* SlowpokeImageNode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SlowpokeImageNode.m; sourceTree = ""; }; + 29E35E9C1A2F8DBC007B4B17 /* SlowpokeShareNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SlowpokeShareNode.h; sourceTree = ""; }; + 29E35E9D1A2F8DBC007B4B17 /* SlowpokeShareNode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SlowpokeShareNode.m; sourceTree = ""; }; + 29E35E9F1A2F9650007B4B17 /* logo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = logo.png; sourceTree = ""; }; + 29E35EA11A2FD0E9007B4B17 /* PostNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PostNode.h; sourceTree = ""; }; + 29E35EA21A2FD0E9007B4B17 /* PostNode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PostNode.m; sourceTree = ""; }; + 3D24B17D1E4A4E7A9566C5E9 /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 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; }; + C068F1D3F0CC317E895FCDAB /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = "Pods/Target Support Files/Pods/Pods.debug.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 05E2127E19D4DB510098F589 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 3EC0CDCBA10D483D9F386E5E /* libPods.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 05E2127819D4DB510098F589 = { + isa = PBXGroup; + children = ( + 05E2128319D4DB510098F589 /* Sample */, + 05E2128219D4DB510098F589 /* Products */, + 1A943BF0259746F18D6E423F /* Frameworks */, + 1AE410B73DA5C3BD087ACDD7 /* Pods */, + ); + sourceTree = ""; + }; + 05E2128219D4DB510098F589 /* Products */ = { + isa = PBXGroup; + children = ( + 05E2128119D4DB510098F589 /* Sample.app */, + ); + name = Products; + sourceTree = ""; + }; + 05E2128319D4DB510098F589 /* Sample */ = { + isa = PBXGroup; + children = ( + 05E2128819D4DB510098F589 /* AppDelegate.h */, + 05E2128919D4DB510098F589 /* AppDelegate.m */, + 29E35E9F1A2F9650007B4B17 /* logo.png */, + 29E35EA11A2FD0E9007B4B17 /* PostNode.h */, + 29E35EA21A2FD0E9007B4B17 /* PostNode.m */, + 29E35E991A2F8DB0007B4B17 /* SlowpokeImageNode.h */, + 29E35E9A1A2F8DB0007B4B17 /* SlowpokeImageNode.m */, + 29E35E9C1A2F8DBC007B4B17 /* SlowpokeShareNode.h */, + 29E35E9D1A2F8DBC007B4B17 /* SlowpokeShareNode.m */, + 29A7F3A31A3638DE00CF34F2 /* SlowpokeTextNode.h */, + 29A7F3A41A3638DE00CF34F2 /* SlowpokeTextNode.m */, + 05E2128419D4DB510098F589 /* Supporting Files */, + 05E2128B19D4DB510098F589 /* ViewController.h */, + 05E2128C19D4DB510098F589 /* ViewController.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 = ""; + }; + 1A943BF0259746F18D6E423F /* Frameworks */ = { + isa = PBXGroup; + children = ( + 3D24B17D1E4A4E7A9566C5E9 /* libPods.a */, + ); + name = Frameworks; + sourceTree = ""; + }; + 1AE410B73DA5C3BD087ACDD7 /* Pods */ = { + isa = PBXGroup; + children = ( + C068F1D3F0CC317E895FCDAB /* Pods.debug.xcconfig */, + 088AA6578212BE9BFBB07B70 /* Pods.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 05E2128019D4DB510098F589 /* Sample */ = { + isa = PBXNativeTarget; + buildConfigurationList = 05E212A419D4DB510098F589 /* Build configuration list for PBXNativeTarget "Sample" */; + buildPhases = ( + E080B80F89C34A25B3488E26 /* Check Pods Manifest.lock */, + 05E2127D19D4DB510098F589 /* Sources */, + 05E2127E19D4DB510098F589 /* Frameworks */, + 05E2127F19D4DB510098F589 /* Resources */, + F012A6F39E0149F18F564F50 /* 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 = 0600; + 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 = ( + 29E35EA01A2F9650007B4B17 /* logo.png in Resources */, + 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 */ + E080B80F89C34A25B3488E26 /* 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; + }; + F012A6F39E0149F18F564F50 /* 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; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 05E2127D19D4DB510098F589 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 29A7F3A51A3638DE00CF34F2 /* SlowpokeTextNode.m in Sources */, + 29E35E9B1A2F8DB0007B4B17 /* SlowpokeImageNode.m in Sources */, + 29E35E9E1A2F8DBC007B4B17 /* SlowpokeShareNode.m in Sources */, + 05E2128D19D4DB510098F589 /* ViewController.m in Sources */, + 05E2128A19D4DB510098F589 /* AppDelegate.m in Sources */, + 29E35EA31A2FD0E9007B4B17 /* PostNode.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; + 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 = C068F1D3F0CC317E895FCDAB /* Pods.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = Sample/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 7.1; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 05E212A619D4DB510098F589 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 088AA6578212BE9BFBB07B70 /* Pods.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = Sample/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 7.1; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + 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/Placeholders/Sample.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/examples/Placeholders/Sample.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000000..a80c038249 --- /dev/null +++ b/examples/Placeholders/Sample.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/examples/Placeholders/Sample.xcworkspace/contents.xcworkspacedata b/examples/Placeholders/Sample.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000000..d98549fd35 --- /dev/null +++ b/examples/Placeholders/Sample.xcworkspace/contents.xcworkspacedata @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples/Placeholders/Sample/AppDelegate.h b/examples/Placeholders/Sample/AppDelegate.h new file mode 100644 index 0000000000..2aa29369b4 --- /dev/null +++ b/examples/Placeholders/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/Placeholders/Sample/AppDelegate.m b/examples/Placeholders/Sample/AppDelegate.m new file mode 100644 index 0000000000..a8e5594780 --- /dev/null +++ b/examples/Placeholders/Sample/AppDelegate.m @@ -0,0 +1,27 @@ +/* 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 "AppDelegate.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]; + [self.window makeKeyAndVisible]; + return YES; +} + +@end diff --git a/examples/Placeholders/Sample/Info.plist b/examples/Placeholders/Sample/Info.plist new file mode 100644 index 0000000000..35d842827b --- /dev/null +++ b/examples/Placeholders/Sample/Info.plist @@ -0,0 +1,36 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + com.facebook.AsyncDisplayKit.$(PRODUCT_NAME:rfc1034identifier) + 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/Placeholders/Sample/PostNode.h b/examples/Placeholders/Sample/PostNode.h new file mode 100644 index 0000000000..2cfa5a6048 --- /dev/null +++ b/examples/Placeholders/Sample/PostNode.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 PostNode : ASDisplayNode + +@end diff --git a/examples/Placeholders/Sample/PostNode.m b/examples/Placeholders/Sample/PostNode.m new file mode 100644 index 0000000000..b23636b17d --- /dev/null +++ b/examples/Placeholders/Sample/PostNode.m @@ -0,0 +1,88 @@ +/* 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 "PostNode.h" + +#import "SlowpokeShareNode.h" +#import "SlowpokeTextNode.h" +#import + +@interface PostNode () +{ + SlowpokeTextNode *_textNode; + SlowpokeShareNode *_needyChildNode; // this node slows down display +} + +@end + +@implementation PostNode + +// turn on to demo that the parent displays a placeholder even if it takes the longest +//+ (void)drawRect:(CGRect)bounds withParameters:(id)parameters isCancelled:(asdisplaynode_iscancelled_block_t)isCancelledBlock isRasterizing:(BOOL)isRasterizing +//{ +// usleep( (long)(1.2 * USEC_PER_SEC) ); // artificial delay of 1.2s +// +// // demonstrates that the parent node should also adhere to the placeholder +// [[UIColor colorWithWhite:0.95 alpha:1.0] setFill]; +// UIRectFill(bounds); +//} + +- (instancetype)init +{ + if (!(self = [super init])) + return nil; + + _textNode = [[SlowpokeTextNode alloc] init]; + _textNode.placeholderInsets = UIEdgeInsetsMake(3.0, 0.0, 3.0, 0.0); + _textNode.placeholderEnabled = YES; + + NSString *text = @"Etiam porta sem malesuada magna mollis euismod. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh."; + NSDictionary *attributes = @{ NSFontAttributeName: [UIFont systemFontOfSize:17.0] }; + _textNode.attributedString = [[NSAttributedString alloc] initWithString:text attributes:attributes]; + + _needyChildNode = [[SlowpokeShareNode alloc] init]; + _needyChildNode.opaque = NO; + + [self addSubnode:_textNode]; + [self addSubnode:_needyChildNode]; + + return self; +} + +- (UIImage *)placeholderImage +{ + CGSize size = self.calculatedSize; + UIGraphicsBeginImageContext(size); + [[UIColor colorWithWhite:0.9 alpha:1] setFill]; + UIRectFill((CGRect){CGPointZero, size}); + UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + return image; +} + +- (CGSize)calculateSizeThatFits:(CGSize)constrainedSize +{ + CGSize textSize = [_textNode measure:constrainedSize]; + CGSize shareSize = [_needyChildNode measure:constrainedSize]; + + return CGSizeMake(constrainedSize.width, textSize.height + 10.0 + shareSize.height); +} + +- (void)layout +{ + CGSize textSize = _textNode.calculatedSize; + CGSize needyChildSize = _needyChildNode.calculatedSize; + + _textNode.frame = (CGRect){CGPointZero, textSize}; + _needyChildNode.frame = (CGRect){0.0, CGRectGetMaxY(_textNode.frame) + 10.0, needyChildSize}; +} + +@end diff --git a/examples/Placeholders/Sample/SlowpokeImageNode.h b/examples/Placeholders/Sample/SlowpokeImageNode.h new file mode 100644 index 0000000000..466590c03a --- /dev/null +++ b/examples/Placeholders/Sample/SlowpokeImageNode.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 SlowpokeImageNode : ASImageNode + +@end diff --git a/examples/Placeholders/Sample/SlowpokeImageNode.m b/examples/Placeholders/Sample/SlowpokeImageNode.m new file mode 100644 index 0000000000..07ba36cd46 --- /dev/null +++ b/examples/Placeholders/Sample/SlowpokeImageNode.m @@ -0,0 +1,65 @@ +/* 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 "SlowpokeImageNode.h" + +#import + +static CGFloat const kASDKLogoAspectRatio = 2.79; + +@implementation SlowpokeImageNode + ++ (UIImage *)displayWithParameters:(id)parameters isCancelled:(asdisplaynode_iscancelled_block_t)isCancelledBlock +{ + usleep( (long)(0.5 * USEC_PER_SEC) ); // artificial delay of 0.5s + + return [super displayWithParameters:parameters isCancelled:isCancelledBlock]; +} + +- (instancetype)init +{ + if (self = [super init]) { + self.placeholderEnabled = YES; + } + return self; +} + +- (CGSize)calculateSizeThatFits:(CGSize)constrainedSize +{ + if (constrainedSize.width > 0.0) { + return CGSizeMake(constrainedSize.width, constrainedSize.width / kASDKLogoAspectRatio); + } else if (constrainedSize.height > 0.0) { + return CGSizeMake(constrainedSize.height * kASDKLogoAspectRatio, constrainedSize.height); + } + return CGSizeZero; +} + +- (UIImage *)placeholderImage +{ + CGSize size = self.calculatedSize; + UIGraphicsBeginImageContext(size); + [[UIColor colorWithWhite:0.9 alpha:1] setStroke]; + + UIBezierPath *path = [UIBezierPath bezierPath]; + [path moveToPoint:CGPointZero]; + [path addLineToPoint:(CGPoint){size.width, size.height}]; + [path stroke]; + + [path moveToPoint:(CGPoint){size.width, 0.0}]; + [path addLineToPoint:(CGPoint){0.0, size.height}]; + [path stroke]; + + UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + return image; +} + +@end diff --git a/examples/Placeholders/Sample/SlowpokeShareNode.h b/examples/Placeholders/Sample/SlowpokeShareNode.h new file mode 100644 index 0000000000..67d3c3b0ef --- /dev/null +++ b/examples/Placeholders/Sample/SlowpokeShareNode.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 SlowpokeShareNode : ASControlNode + +@end diff --git a/examples/Placeholders/Sample/SlowpokeShareNode.m b/examples/Placeholders/Sample/SlowpokeShareNode.m new file mode 100644 index 0000000000..e00a739d37 --- /dev/null +++ b/examples/Placeholders/Sample/SlowpokeShareNode.m @@ -0,0 +1,43 @@ +/* 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 "SlowpokeShareNode.h" + +#import + +static NSUInteger const kRingCount = 3; +static CGFloat const kRingStrokeWidth = 1.0; +static CGSize const kIconSize = (CGSize){ 60.0, 17.0 }; + +@implementation SlowpokeShareNode + ++ (void)drawRect:(CGRect)bounds withParameters:(id)parameters isCancelled:(asdisplaynode_iscancelled_block_t)isCancelledBlock isRasterizing:(BOOL)isRasterizing +{ + usleep( (long)(0.8 * USEC_PER_SEC) ); // artificial delay of 0.8s + + [[UIColor colorWithRed:0.f green:122/255.f blue:1.f alpha:1.f] setStroke]; + + for (NSUInteger i = 0; i < kRingCount; i++) { + CGFloat x = i * kIconSize.width / kRingCount; + CGRect frame = CGRectMake(x, 0.f, kIconSize.height, kIconSize.height); + CGRect strokeFrame = CGRectInset(frame, kRingStrokeWidth, kRingStrokeWidth); + UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:strokeFrame cornerRadius:kIconSize.height / 2.f]; + [path setLineWidth:kRingStrokeWidth]; + [path stroke]; + } +} + +- (CGSize)calculateSizeThatFits:(CGSize)constrainedSize +{ + return kIconSize; +} + +@end diff --git a/examples/Placeholders/Sample/SlowpokeTextNode.h b/examples/Placeholders/Sample/SlowpokeTextNode.h new file mode 100644 index 0000000000..199430330c --- /dev/null +++ b/examples/Placeholders/Sample/SlowpokeTextNode.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 SlowpokeTextNode : ASTextNode + +@end diff --git a/examples/Placeholders/Sample/SlowpokeTextNode.m b/examples/Placeholders/Sample/SlowpokeTextNode.m new file mode 100644 index 0000000000..db309741c9 --- /dev/null +++ b/examples/Placeholders/Sample/SlowpokeTextNode.m @@ -0,0 +1,25 @@ +/* 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 "SlowpokeTextNode.h" + +#import + +@implementation SlowpokeTextNode + ++ (void)drawRect:(CGRect)bounds withParameters:(id)parameters isCancelled:(asdisplaynode_iscancelled_block_t)isCancelledBlock isRasterizing:(BOOL)isRasterizing +{ + usleep( (long)(1.0 * USEC_PER_SEC) ); // artificial delay of 1.0 + + [super drawRect:bounds withParameters:parameters isCancelled:isCancelledBlock isRasterizing:isRasterizing]; +} + +@end diff --git a/examples/Placeholders/Sample/ViewController.h b/examples/Placeholders/Sample/ViewController.h new file mode 100644 index 0000000000..d0e9200d88 --- /dev/null +++ b/examples/Placeholders/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/Placeholders/Sample/ViewController.m b/examples/Placeholders/Sample/ViewController.m new file mode 100644 index 0000000000..82b140fa46 --- /dev/null +++ b/examples/Placeholders/Sample/ViewController.m @@ -0,0 +1,105 @@ +/* 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 + +#import "PostNode.h" +#import "SlowpokeImageNode.h" +#import + +@interface ViewController () +{ + PostNode *_postNode; + SlowpokeImageNode *_imageNode; + UIButton *_displayButton; +} + +@end + + +@implementation ViewController + +#pragma mark - +#pragma mark UIViewController + +- (instancetype)init +{ + if (!(self = [super init])) + return nil; + + _displayButton = [UIButton buttonWithType:UIButtonTypeCustom]; + [_displayButton setTitle:@"Display me!" forState:UIControlStateNormal]; + [_displayButton addTarget:self action:@selector(onDisplayButton:) forControlEvents:UIControlEventTouchUpInside]; + + UIColor *tintBlue = [UIColor colorWithRed:0 green:122/255.0 blue:1.0 alpha:1.0]; + [_displayButton setTitleColor:tintBlue forState:UIControlStateNormal]; + [_displayButton setTitleColor:[tintBlue colorWithAlphaComponent:0.5] forState:UIControlStateHighlighted]; + _displayButton.backgroundColor = [UIColor colorWithWhite:0.95 alpha:1.0]; + + return self; +} + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + [self.view addSubview:_displayButton]; +} + +- (void)viewWillLayoutSubviews +{ + CGFloat padding = 20.0; + CGRect bounds = self.view.bounds; + CGFloat constrainedWidth = CGRectGetWidth(bounds); + CGSize constrainedSize = CGSizeMake(constrainedWidth - 2 * padding, CGFLOAT_MAX); + + CGSize postSize = [_postNode measure:constrainedSize]; + CGSize imageSize = [_imageNode measure:constrainedSize]; + + _imageNode.frame = (CGRect){padding, padding, imageSize}; + _postNode.frame = (CGRect){padding, CGRectGetMaxY(_imageNode.frame) + 10.0, postSize}; + + CGFloat buttonHeight = 55.0; + _displayButton.frame = (CGRect){0.0, CGRectGetHeight(bounds) - buttonHeight, CGRectGetWidth(bounds), buttonHeight}; +} + +// this method is pretty gross and just for demonstration :] +- (void)createAndDisplayNodes +{ + [_imageNode.view removeFromSuperview]; + [_postNode.view removeFromSuperview]; + + // ASImageNode gets placeholders by default + _imageNode = [[SlowpokeImageNode alloc] init]; + _imageNode.image = [UIImage imageNamed:@"logo"]; + + _postNode = [[PostNode alloc] init]; + + // change to NO to see text placeholders, change to YES to see the parent placeholder + // this placeholder will cover all subnodes while they are displaying, just a like a stage curtain! + _postNode.placeholderEnabled = NO; + + [self.view addSubview:_imageNode.view]; + [self.view addSubview:_postNode.view]; +} + + +#pragma mark - +#pragma mark Actions + +- (void)onDisplayButton:(id)sender +{ + [self createAndDisplayNodes]; +} + +@end diff --git a/examples/Placeholders/Sample/logo.png b/examples/Placeholders/Sample/logo.png new file mode 100755 index 0000000000000000000000000000000000000000..dce1ebc95066e56bf72c591027b7776b767a5786 GIT binary patch literal 105684 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

AgH(i{EZ2lp^1>P->`lX~`! zE#sEA=?wkTn$;$5-V%F1VK^A3$5LiN)@K}^O3NZnF& z_exCi4c%x9s^q;|1+bnlDU?Fr-r8tO>1+OEXD4DQ=>EHv|Ld7`Wo8~~O=3bgqIg?d zDza8$7=*C+2;y4!TSvDGLP@f`LZUw3s5Yf0ji9RbU-&H+c3i4Bt3@}N;{kSe^;ds?n88X-N+1$1k}*jUiPbn=4`V7g%~Xoy^;ZvuB14}t62f?F4AJ4 z+xUN-$WD-azrwo7^)_zQF1eg9!Fm)WU#%YP**>S?_YhU`*1SvOtKE(W8{ljmv7zP0 zsx=kr3`RoD$!NsY>UK}ayO}b3bQruw(HE`L#r9t_m>HiZs}Y}s%_g5-l!D)lmd2mW zKn$eD`K~8cf*`QI7179&z!AQHpfeZI61P~;XSAEvt~g8l@t{5JU=+@Al|8VCKOw=h z(5v}1zQU;YDm?1H-n3j8kAQDmGPhXGo`x63w~xMDjJw>M*503rf)?xzrGdOTv&IkdyF!Fq2JgJ%swy~BD9a#8X#be zdOZ*LSfmkBm~od_tlCsj3lUhw|Ajq4fKBn%usA8$Y)b|@O!sb`^ICW_UINz{)geh( znG^!ZjRUdmnZO=iye+A;Pl>`)Wfaq#olUS?-x^UO#$7(Y#5J{wc1`K_Cx)x*pO4VqSV(LG_ac{ z;iA0O>a6g9|HIGj-GWVf7SB&KvGV2y!>2QS# zzgy{I09fzZnFNWB+R=SHFuyTdX;U1BJ>ZJcw-L&z6Xom*^`ky30t?j*caJztY zCv!&<1P=?0&JS*`25SEr@UFC4NxL%-_y3R2^3ncO2ash#y3$JhSr7{K#-~D?xNVPO z-EsYTSE#Fl^?7~*Yk1mr#rrgga6@7p%zlV};-V^9Yb8@`tA%9b;X`ct5$rQZ>wdWn zN!LAnrujPeqSJp7`SF{3#FX#RdOJe0{DK`FNM5+FRW(dIxre1c6s-nQV#4X?#e(vu z2FU#)1&WqkfXOWkWvL7s6s%8`Z3swpQun>lT;J2JXqu7&rZ(n^PzrV*HOQcQ_#LVL zrZAZK4uV){GxiV@=JEj6@B`L~D!X4{QUNEK^{@uSM817sb)o3K#f2hMA3^``!wu&E zQ9K23+FfAcBFUT7yul3HiWZMENkRy^w(!mgPuDX}vs=&T%FPbhKPAv}r?CGQt*NIk z;=kzZc8(~vONw@}8tlbyZUS|35HFnJLC0oHxjMz_4^yLtF%*D3MD=#x@BPvwVc6$5) zLDG8v?%owdcDgWNfwJN426D3%-_wSR#6IIe9q?PBzoGAiX{<>y1^8C!#fD)_YC}@` z9Thl_uKu}9#epr5j}R9oS^)e>VHHXGJx-w9D}{k<5goZOtsNCGpdL_`Ya=Y3nt*8W zJhDBMkBwH@cs=EtS)1co7}EtR`rq&ST~OP7Y9C#po%lkZ6?+O{c{rNW|6zcJjnDMRYDVij&LR7!hac9#=% zNNg@(dSOvLb2}vmpe|@EBiuax8wf|sQc7JLK6a%0+7g2ak-ce~=#`jIJ5Y|d+=^)S zOgIyX_G_OD-g)?l02(^Les%8jJQ~TUU#eRV)c4Ty*jsOjUuFZ@$fdodw1-msEeu~E z$H#P;{vRJ$=}TO(8GD`;W?ahs@uQ}qKte`;B=Kcmy-M1M!^|~DcJ}8^(ajmtC{AJN zGXd*`nM|bKvANw&uLo6Zy&(KZ8|`G0Hz)8QKiIabIdRZx8=jlTgY7IWX8le8)Aauj zK(Ze3wT7#11fg7V$A8$29ecb-oU%vThY+d|d+^H%aQ{T@E<4Z=l;4VM+8}xNR=xcYf_0+Wem3i#9Xw$tr+YN*a!Wv#~Oe?Wm64zBUo*dL;imdvoLHqQ- z7?8vEGUaZA^dz2YyfPCf=~}vhEd-o`HLNEM;df!efSY?|ttZqBWYgmKGvQHxaDLz2 z^?Jsm$N!sZ@5so=)?u*3&N}lf?9fd>MbF^(+nZseF}TZx2@D7s$DWo@V^G7#gWNu| zb9Jn;x_Xtjv8;v!gRvaSds z#RL+N2&+f{LsM2MQdD|JSwW>40%0LE6%v6!C<3`6AR~!pTH-r8_0-_ zt#%OA^$6}V#o+HuM)ki~ad8m&Tz$Yv*CRQXD(8wGY>km~l)xrCjba-%zwDihTu^>3 zJ<%_H(&(d*>;OH4Iyp%-n&fF}Zueq}H5SMw1v?mEA+M)2zi{gv4_a98RkOKouPmylCml*l;qdaB zr0t9@8Y)0xR!8-eq6L_BQ4K=@x^jB-A z^hHME1b56Ur~QwPZYZmbH>h%AeQ0njd_wCl`xr$~?$*Mcbh;oR?_$PTa8_o<#8$Nj zY`{D+$b&muDlsO|Orf5b;Fq83cLpOLr``E*eVcnfoJ~9G`!Dyr?OA9{2GM)R34%VS zmsW2Oj%C){iL+77xrsU`38c6bO$Um~;$Gvt{$uFyhp&((syK`6#?WNsYjyO24!r-f zKlE9|GzbnL9b=Q4y7ai^qzTbMtnwQ>&Bfgc<0mH7F=9sr3qck&e~Xa9oA(Y1`T~SH zv)qx~bSDX?DsV$k+*!S0A}CJSTJ)6moo}g>W%PFZ(IeJk_vdU;%f!KY)HXj{nLv!! zk;Cy=yM)F58_b`)GQ@WDLp*G!5jSGksncmoCg0(s;5(C9?n@+&&qEI0;& z{lCeZqh7aVR;WzAPijJeZbhqS&WW&g8?ymtK9f5#B){mQ_Rd(P%KvOty+2M}Uu1VW z+pf*}0@mgv@lo`iq4f$B)fP=|AZxfD9bbS?VV(%qQ$=Epk<7#;tDc=M5hHQPw0!x1 zgH%Q8A?mfV>xTxlpvE?ySD@QP-FIH(u8ge7C1lqg8;7Ep^>R|UD|dpsC3Cd%MvoTR zk4%k-ld{(4Qt{IxQ8|WOGxdOI9gSqniKqsh7Q2vA&$8r?%m&o~TXgxO-3f;VZZksL zc$J-fDfoh1m!f0U>jJaa=!=I@TJNeZS8NSn^u*a-E@HfBfe%4#h3B*N;*8bh&3Hrd z<^h$zX=-L56BtYC-KlNT?o5Aa_CUe}rgS&5w{63)K{8JI+1K9T{z9)iDD>A~zV%~O z8>BM4>QP4Jd)~Px=;hv>w5$WCmUO=!@5JMI&dTnKUsacQ^-q#wv*hD(X`*bZQf%Ir z`^+J1gOl+|VoUDA&Cn4ZQEQ3n6Hp{#omKcX_kpS7jG2~hcTkm*p6&}7kMwLl6=QZx z>ZLa8#*uX6CQZu~aXTCU{a3?z6I!{_Y27KQ+t~xRo;Lyi`BE-CUiX4h`>_|7ew!YO zACQ{zoSWM&G{-wsm3A}1b;yw0_+DtiXK;>!Fo5%*ml~<(m3EIM_`S4R@j`)#AV6}! z`W~e2=K}YhV$psLdJb(eYWU^g`26+ppvub5Q;1y+6VPd>LnHNq((%dzRGRZDw7<%g z9}&nwGGqkVYNVC~5X?CHGB+TkUT%bTTJ%0T7fpx!^gzc!r4aJRcIs%vWP!d~&PQMZduP0jw84DLctzvRAwJpjLK(RB4Cz zD*vHZg`4#QxTX|Kf>Q*}E!l6s4bz*?!6C-$FY4Z|avD-EvEnGT`x}570KlW7y3|n> zG~@+lQ~1r^vw{dlcsJRj@cfmd1&NYz>^MagyA_fgC?Kt%f--S(uj7Qw_Y{@+5(t#4 zuRm1hPW=go!?WVda%9&LRP8q?z#+aG{%xsacDm5U_1NSvEDY7t1QBE!PzuOWBWmSF$FaN^KPnB`&?{qK*+&oolBk@?f)`*H0FnsrgtmMGLRbdL?s~i^ zF~9_6|s%+4M*|4My zI`US|2Z*3I0OG@}0p&R1jOAPJF-vG?8;&1QLE=u0jvHyD`2H7hh#XMj*o z#Y!By42_b%iZlH#g7X%H(4UF%@{k|@Y}wO&wN{*2p-OZjP`*Lav`kppL83J$I*F;H zPL(0v0&8azLOI=zl;?Brjmhy?JvHUKPm5j{{S@9=+M^KB?#CR#9qRu~&F^D0!|8W@8|IirHfKP`iB4L*xXJ4|fkX|AsPoK-ueoTUsq{V$)Tj z6km)R$ct8liy@?1E<;0w(^qt7v>^G+r6*P^qy<`omY?cB=Fyyw@be_5ttQcnK;Ym3 zA|Ba{aE;(B(xj_Qbm16aRyKSDNR6v7{L`-{NTzCB(IrlT*wY`-aP0))IK{GYC=!Rl zQL(~nR5dR<-@l6sXRrnJZn<-?HlzyC$s(c}2+$ICX3>}6AkwttPr-5yt>Ktmc0vdJ z4lIj08T>?F~-jjHX6A%SmXU`$JE3#a?RD(-lAQpT2&Clu8==!PV&Q zo;#C55ghlYufciW4 z3BQLH{3`lOdr-0{U7LzQ^1TtV{X<*K+ZDbcqJXL)godI(aoG+kS4ye!A~;d90T5zq z*s`*Heg&0)9umBJ(}4)_6{rs+u*H37@l_yRyJfdo9a+O5az zXxhpg8+|p$tm{cmjjMR`H{YC4iF!c_|FF6 z9O+mQ(91lcDh_cAK|3d);h&+uT;I%aD>=z68Ho2vnllx#uj1ST#|j&OaI0dpr1s*? zi7X}ECa*#bvTWgL%-a5|1dRBG@f@vR#EI@CNSzYR0i3^JL_98lkSeIiw$Iu6ChjwM z&zdlMpsARgF207-J$#4Z<)51$;Vxk}emSC}g+ke6H-PU85-bR@5BR_QL}{SZb+9M; zFC|Dm?8bg-CcMtVt`hA2-!fPA$BIEmDoze(J~n~zQ={(VR+9Kt@_dt*I-p&){wbr6 z{YsJ=B6cr5{N`}^-%{enqlLc_ex+Q{d^bR!x8g`c$`O(d&UupT{fUy)g(EYjRh6k~ zi`rlQSH$_By0X~QPfm~vq~|qvtzM)o3M*xQAqX5NcJK4hobf^INH_bCKFI}sv5@sGLp)byB|ZzzKIR^bqS z%Lb2p7VEc{%Z2%&-$kTzE7b zE~)*tM>l{lt1Hr0=5+zhmKEykDNhwyIk(m4y#=0jL_ z=90tI3vV~p+f|=43<|uUm@YP)blp1ZQj(9Ikksf5WC%emmFEx$@@sx$HI$+I*e*`H zb8jLXY$TKlwvT^ESjn{MUudl3G(|S1y$_;O6_?7@JxadvPvvP8+7@b^aF27$Zve*w z^we1pE3Od#Ps(cJO|%=qk>E@*5t15@g6=@t5Su2{td$ncPGF}fc7yxLqJZDCab7r^ z`Y+H|rs2Qv!4uOt0#O$#PnVUqF|rGj!=)W)3+E_KU=QyIqH}rdZl7jbPe1xsX}(u+ zFO>OAOt$ff{CtIv?}5tMjDv4FcCk;{8ZFYF%nLN#$U?GBx)QH+xzOLmjacOsJ3kM^ z$K5r&v-kF{gD6q`y+7@%`Q_Ea`}e1~$sW#9n1lOfe42D-i1r1E%=f|a;7h}1+h3XV zOy*o>h@b<+iS_K@I@z_}0(rEUXrR@`yB|YZPar3c&X*4v3p0G>3E5pj&58XOxtb>S z7o>7zs))@n=k+JywX*C^(&o+j3j7A1S70Vuz-u+QSw|P{Yw9@1^$i;p`;1 zuUV#UdM1*jRpHuhYp6!lsHxm&Lyt!+o`yXo{l^wqo+NkTkBI0&{wLaogVkI0Ch1Q? z9rLeqFMkeQONNJ8ZQLjmcdI8siu(r~g(iB$< z|2Tmsb2~C*JuIZesbk?V)El#xiDxTc^6{jc0ZD5IDnBF^@h0v>d zUA8yw79Y6Br?<|7ZBIh61OR`bMk(A@nA(wv*p5OHyx~QIS-6%|rLj7?6%ryA zkHgWV)Vp8iW@;^HF1pUeU|FF##^Kdc?aKYx1Ny2HzD&v?`` zvd;)N-(c6V_LJsw>LR2BRBoGvNlI|LSrmiWg%(_hSK-+8?5zoK3XviJSf!Y!hIz7d>#I4vN4m>Dq?4ph zaDmHMKSXUv*k?m)I@suP5m!r*{8+3Inkvmj!`GrVPW-aYN--`oEIL{`s!@ERSRu?$ zj+6dG+jFDCIZ0`hCgF;US&Ud#7bZXg2(~rzmhZo;Az2EA;yi0jsZqfT)#M*EJ?0Ti z=U>o^3{MqBX=~!%bQV$;i$~qjoj29*C$H1pjA;%_4qYYLRVL8s5dgQcVoAhfQW@$N zy_-n$C);O6Ury(S_-S+Quzrmapardici<r6LubY<8msB~$tv@2GMYpYEKzX05ayL}09@Lgy3e0FzANl`VrySs8uc255R*RwQgrR{<(yncg+TWfrX zGs9)O;tt%OyN-WG|8bqy;nRHCK|&e>s>|ocKS2B(rGfOa1p(dalkSk{_y^qf79jtM&L z>FDx9;yk@h2p-YMkFd2#(jR=xnv|0Ga%DYRv);TU3DJ5alH2=7FI`G<9?arQZ;RTh zS;t4hobkBHKw*$X-#kH#eZ-JaD&m~3U{6%d( zZ+oQ-$q{~sU$Dwqt~dQFjM0-AUdK|(M$wRU3YKAjs_8kG)P^++HYtIT=QDVc zMAtE*G2XM>V-7?lv^(Vs1AD}{jvSJP9z^=$7thc|r7n$!lI+h8q4oHSbS zk`WMp;Bl!U=PYa(6`Pi$$J~0bYBz1S3cA-|3;K$ThXp*rYLk*zXVO-(%P@x}Cp`*>;8LBbz!BirBaL{A`-nW$2OY0_{ z&Z1&)w9nF}-TpOIpwVyMJImjeUtI383Pgyi*u%*x)QyA!YO1oGNXEtc1Qc#N7edorv?Nm&b;y2Fg>KNqlo2gDiEL%OeYoy4tzVn0a|6rb$tIkcys6CnM&T!+&SMdZ;fqDxOpNmU9u-YWWMgDw#NtIbaG5Y| zXy#&oL4dJ~+5J)lLJnPM>cKiikhvu;lyWJ_doY!BH9DY5DDFUt&&YHiXBt;KB9ZxY z$vahoc-30E_HCy&o0!-x9FreuyDg_m*5|#DK*kJj`>r+5v+chD(mt{u{5R_~saK(K z)9(IHEv+fKlg?E7f$|GgcAtY!4RONQ$je+B$IX6}vpbVWqNvN!F13%%@BQ+FQTTfL zN+Ga?e~ye|s}9a!&bydpJnLh8WGSP~Ytj@AhP}h98cIhy)P!G z>-_Y-=#tt5@>@Nqsoj$xp`Pf{WRP)l45Et9jRGN1lg>1Cl)>J;qmkAmLn+ zbJiG}R6?V8*qlQ9xR`}KyT&kO$NjB{7}c4z8CyNvcmDwnTFtSB>`G|KQ^#-cJ}^>^ z3~dF@JWIVKEX_ukN>xA3FuumnseQJZzeF?(0-x?+Wl8scKQ{hu220zT`r_t1Bl(PQ zN43f^5vnY~815i=(Jad}Rt`3ZW^(|OVQyKI?>_TzgrpTe{gq(@f-(3LLA5Tf#x1Jb zvV*QVL$|x(x(efP1MFjgmBdHteZO|=nR^Ei;4LJrxC3cE7;0*_n%(gT^k)~vRiiV=&G`faLp>ciotlo*`zz{F(uO- z=lT<#xPiBo{4+l72Y#^7r>MJKqP)r!@8s9P~_a7i&E9bEx|CRH8PhaaA_CRrPc$!tXIpv~`9ba6B!z(~k+$ z0ro?ht3p5sFRM(F@F^*`nd=n!#!c!PDTzC~WGP;FW`r+0CTZE0thW=7acYbz^Rs`@ zX?2V3S}h(R@P~nKtInD9h0_QHjwLKR;EV_n?DCfc=nWCs)oJlUlX8r618)sKi@<;6 zRvk3`Y0`?zTv;&!VIsDCgHJZ^+&tc%bHT<8?n}OEEZp+8m&|Uh?5IlH)#W0~!$(}D zus&3bkVG`S3)21~ql0ETVh`XCv0WF5S6IK9d-*7F@Lb+G*~DV0Z#3lskb0oMwQbTl z>$uXLYdDkL?s<-OlnSo>f + +#import "AppDelegate.h" + +int main(int argc, char * argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +}