Swiftgram/submodules/AsyncDisplayKit/Source/ASVisibilityProtocols.h
Peter 9bc996374f Add 'submodules/AsyncDisplayKit/' from commit '02bedc12816e251ad71777f9d2578329b6d2bef6'
git-subtree-dir: submodules/AsyncDisplayKit
git-subtree-mainline: d06f423e0ed3df1fed9bd10d79ee312a9179b632
git-subtree-split: 02bedc12816e251ad71777f9d2578329b6d2bef6
2019-06-11 18:42:43 +01:00

146 lines
4.9 KiB
Objective-C

//
// ASVisibilityProtocols.h
// Texture
//
// Copyright (c) Facebook, Inc. and its affiliates. All rights reserved.
// Changes after 4/13/2017 are: Copyright (c) Pinterest, Inc. All rights reserved.
// Licensed under Apache 2.0: http://www.apache.org/licenses/LICENSE-2.0
//
#import <AsyncDisplayKit/ASBaseDefines.h>
#import <AsyncDisplayKit/ASLayoutRangeType.h>
NS_ASSUME_NONNULL_BEGIN
@class UIViewController;
AS_EXTERN ASLayoutRangeMode ASLayoutRangeModeForVisibilityDepth(NSUInteger visibilityDepth);
/**
* ASVisibilityDepth
*
* @discussion "Visibility Depth" represents the number of user actions required to make an ASDisplayNode or
* ASViewController visibile. AsyncDisplayKit uses this information to intelligently manage memory and focus
* resources where they are most visible to the user.
*
* The ASVisibilityDepth protocol describes how custom view controllers can integrate with this system.
*
* Parent view controllers should also implement @c ASManagesChildVisibilityDepth
*
* @see ASManagesChildVisibilityDepth
*/
@protocol ASVisibilityDepth <NSObject>
/**
* Visibility depth
*
* @discussion Represents the number of user actions necessary to reach the view controller. An increased visibility
* depth indicates a higher number of user interactions for the view controller to be visible again. For example,
* an onscreen navigation controller's top view controller should have a visibility depth of 0. The view controller
* one from the top should have a visibility deptch of 1 as should the root view controller in the stack (because
* the user can hold the back button to pop to the root view controller).
*
* Visibility depth is used to automatically adjust ranges on range controllers (and thus free up memory) and can
* be used to reduce memory usage of other items as well.
*/
- (NSInteger)visibilityDepth;
/**
* Called when visibility depth changes
*
* @discussion @c visibilityDepthDidChange is called whenever the visibility depth of the represented view controller
* has changed.
*
* If implemented by a view controller container, use this method to notify child view controllers that their view
* depth has changed @see ASNavigationController.m
*
* If implemented on an ASViewController, use this method to reduce or increase the resources that your
* view controller uses. A higher visibility depth view controller should decrease it's resource usage, a lower
* visibility depth controller should pre-warm resources in preperation for a display at 0 depth.
*
* ASViewController implements this method and reduces / increases range mode of supporting nodes (such as ASCollectionNode
* and ASTableNode).
*
* @see visibilityDepth
*/
- (void)visibilityDepthDidChange;
@end
/**
* ASManagesChildVisibilityDepth
*
* @discussion A protocol which should be implemented by container view controllers to allow proper
* propagation of visibility depth
*
* @see ASVisibilityDepth
*/
@protocol ASManagesChildVisibilityDepth <ASVisibilityDepth>
/**
* @abstract Container view controllers should adopt this protocol to indicate that they will manage their child's
* visibilityDepth. For example, ASNavigationController adopts this protocol and manages its childrens visibility
* depth.
*
* If you adopt this protocol, you *must* also emit visibilityDepthDidChange messages to child view controllers.
*
* @param childViewController Expected to return the visibility depth of the child view controller.
*/
- (NSInteger)visibilityDepthOfChildViewController:(UIViewController *)childViewController;
@end
#define ASVisibilitySetVisibilityDepth \
- (void)setVisibilityDepth:(NSUInteger)visibilityDepth \
{ \
if (_visibilityDepth == visibilityDepth) { \
return; \
} \
_visibilityDepth = visibilityDepth; \
[self visibilityDepthDidChange]; \
}
#define ASVisibilityDepthImplementation \
- (NSInteger)visibilityDepth \
{ \
if (self.parentViewController && _parentManagesVisibilityDepth == NO) { \
_parentManagesVisibilityDepth = [self.parentViewController conformsToProtocol:@protocol(ASManagesChildVisibilityDepth)]; \
} \
\
if (_parentManagesVisibilityDepth) { \
return [(id <ASManagesChildVisibilityDepth>)self.parentViewController visibilityDepthOfChildViewController:self]; \
} \
return _visibilityDepth; \
}
#define ASVisibilityViewDidDisappearImplementation \
- (void)viewDidDisappear:(BOOL)animated \
{ \
[super viewDidDisappear:animated]; \
\
if (_parentManagesVisibilityDepth == NO) { \
[self setVisibilityDepth:1]; \
} \
}
#define ASVisibilityViewWillAppear \
- (void)viewWillAppear:(BOOL)animated \
{ \
[super viewWillAppear:animated]; \
\
if (_parentManagesVisibilityDepth == NO) { \
[self setVisibilityDepth:0]; \
} \
}
#define ASVisibilityDidMoveToParentViewController \
- (void)didMoveToParentViewController:(UIViewController *)parent \
{ \
[super didMoveToParentViewController:parent]; \
_parentManagesVisibilityDepth = NO; \
[self visibilityDepthDidChange]; \
}
NS_ASSUME_NONNULL_END