diff --git a/AsyncDisplayKit/ASDisplayNode.h b/AsyncDisplayKit/ASDisplayNode.h index 7c53e93a05..ff63eeee2d 100644 --- a/AsyncDisplayKit/ASDisplayNode.h +++ b/AsyncDisplayKit/ASDisplayNode.h @@ -15,6 +15,8 @@ #import #import +#define ASDisplayNodeLoggingEnabled 0 + @class ASDisplayNode; /** diff --git a/AsyncDisplayKit/ASDisplayNode.mm b/AsyncDisplayKit/ASDisplayNode.mm index d855c1780f..8c1ea59722 100644 --- a/AsyncDisplayKit/ASDisplayNode.mm +++ b/AsyncDisplayKit/ASDisplayNode.mm @@ -48,8 +48,11 @@ NSString * const ASRenderingEngineDidDisplayNodesScheduledBeforeTimestamp = @"AS @end -//#define LOG(...) NSLog(__VA_ARGS__) -#define LOG(...) +#if ASDisplayNodeLoggingEnabled + #define LOG(...) NSLog(__VA_ARGS__) +#else + #define LOG(...) +#endif // Conditionally time these scopes to our debug ivars (only exist in debug/profile builds) #if TIME_DISPLAYNODE_OPS @@ -1078,19 +1081,54 @@ static ASDisplayNodeMethodOverrides GetASDisplayNodeMethodOverrides(Class c) ASDisplayNodeAssertMainThread(); ASDN::MutexLocker l(_propertyLock); CGRect bounds = self.bounds; - if (CGRectEqualToRect(bounds, CGRectZero)) { - // Performing layout on a zero-bounds view often results in frame calculations - // with negative sizes after applying margins, which will cause - // measureWithSizeRange: on subnodes to assert. + + [self measureNodeWithBoundsIfNecessary:bounds]; + + // Performing layout on a zero-bounds view often results in frame calculations + // with negative sizes after applying margins, which will cause + // measureWithSizeRange: on subnodes to assert. + if (!CGRectEqualToRect(bounds, CGRectZero)) { + _placeholderLayer.frame = bounds; + [self layout]; + [self layoutDidFinish]; + } +} + +- (void)measureNodeWithBoundsIfNecessary:(CGRect)bounds +{ + // Normally measure will be called before layout occurs. If this doesn't happen, nothing is going to call it at all. + // We simply call measureWithSizeRange: using a size range equal to whatever bounds were provided to that element or + // try to measure the node with the largest size as possible + if (self.supernode == nil && !self.supportsRangeManagedInterfaceState && !_flags.isMeasured) { + if (CGRectEqualToRect(bounds, CGRectZero)) { + LOG(@"Warning: No size given for node before node was trying to layout itself: %@. Please provide a frame for the node.", self); + } else { + [self measureWithSizeRange:ASSizeRangeMake(CGSizeZero, bounds.size)]; + } + } +} + +- (void)layout +{ + ASDisplayNodeAssertMainThread(); + + if (!_flags.isMeasured) { return; } - _placeholderLayer.frame = bounds; - [self layout]; - [self layoutDidFinish]; + + [self __layoutSublayouts]; +} + +- (void)__layoutSublayouts +{ + for (ASLayout *subnodeLayout in _layout.immediateSublayouts) { + ((ASDisplayNode *)subnodeLayout.layoutableObject).frame = [subnodeLayout frame]; + } } - (void)layoutDidFinish { + // Hook for subclasses } - (CATransform3D)_transformToAncestor:(ASDisplayNode *)ancestor @@ -2377,24 +2415,6 @@ void recursivelyTriggerDisplayForLayer(CALayer *layer, BOOL shouldBlock) } } -- (void)layout -{ - ASDisplayNodeAssertMainThread(); - - if (!_flags.isMeasured) { - return; - } - - [self __layoutSublayouts]; -} - -- (void)__layoutSublayouts -{ - for (ASLayout *subnodeLayout in _layout.immediateSublayouts) { - ((ASDisplayNode *)subnodeLayout.layoutableObject).frame = [subnodeLayout frame]; - } -} - - (void)displayWillStart { ASDisplayNodeAssertMainThread(); diff --git a/examples/Videos/Sample/ViewController.h b/examples/Videos/Sample/ViewController.h index 1664a00082..7549a97db6 100644 --- a/examples/Videos/Sample/ViewController.h +++ b/examples/Videos/Sample/ViewController.h @@ -8,8 +8,8 @@ * 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 + +#include @interface ViewController : UIViewController diff --git a/examples/Videos/Sample/ViewController.m b/examples/Videos/Sample/ViewController.m index db1f18659d..289d5443d4 100644 --- a/examples/Videos/Sample/ViewController.m +++ b/examples/Videos/Sample/ViewController.m @@ -10,8 +10,7 @@ */ #import "ViewController.h" -#import "ASLayoutSpec.h" -#import "ASStaticLayoutSpec.h" +#import @interface ViewController() @property (nonatomic, strong) ASDisplayNode *rootNode; @@ -22,12 +21,23 @@ #pragma mark - UIViewController -- (void)viewWillAppear:(BOOL)animated +- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { - [super viewWillAppear:animated]; + self = [super initWithNibName:nil bundle:nil]; + if (self) { + + } + return self; +} + +- (void)viewDidLoad +{ + [super viewDidLoad]; + // Root node for the view controller _rootNode = [ASDisplayNode new]; + _rootNode.frame = self.view.bounds; _rootNode.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; ASVideoNode *guitarVideoNode = self.guitarVideoNode; @@ -54,16 +64,6 @@ [self.view addSubnode:_rootNode]; } -- (void)viewDidLayoutSubviews -{ - [super viewDidLayoutSubviews]; - - // After all subviews are layed out we have to measure it and move the root node to the right place - CGSize viewSize = self.view.bounds.size; - [self.rootNode measureWithSizeRange:ASSizeRangeMake(viewSize, viewSize)]; - [self.rootNode setNeedsLayout]; -} - #pragma mark - Getter / Setter - (ASVideoNode *)guitarVideoNode;