mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-08-22 21:44:46 +00:00
87 lines
2.0 KiB
Plaintext
87 lines
2.0 KiB
Plaintext
/* Copyright (c) 2014-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*/
|
|
|
|
#import "ASRangeHandlerRender.h"
|
|
|
|
#import "ASDisplayNode.h"
|
|
#import "ASDisplayNode+Subclasses.h"
|
|
#import "ASDisplayNodeInternal.h"
|
|
|
|
@interface ASDisplayNode (ASRangeHandlerRender)
|
|
|
|
- (void)display;
|
|
- (void)recursivelyDisplay;
|
|
|
|
@end
|
|
|
|
@implementation ASDisplayNode (ASRangeHandlerRender)
|
|
|
|
- (void)display
|
|
{
|
|
if (![self __shouldLoadViewOrLayer]) {
|
|
return;
|
|
}
|
|
|
|
ASDisplayNodeAssertMainThread();
|
|
ASDisplayNodeAssert(self.nodeLoaded, @"backing store must be loaded before calling -display");
|
|
|
|
CALayer *layer = self.layer;
|
|
|
|
// rendering a backing store requires a node be laid out
|
|
[layer setNeedsLayout];
|
|
[layer layoutIfNeeded];
|
|
|
|
if (layer.contents) {
|
|
return;
|
|
}
|
|
|
|
[layer setNeedsDisplay];
|
|
[layer displayIfNeeded];
|
|
}
|
|
|
|
- (void)recursivelyDisplay
|
|
{
|
|
if (![self __shouldLoadViewOrLayer]) {
|
|
return;
|
|
}
|
|
|
|
for (ASDisplayNode *node in self.subnodes) {
|
|
[node recursivelyDisplay];
|
|
}
|
|
|
|
[self display];
|
|
}
|
|
|
|
@end
|
|
|
|
@implementation ASRangeHandlerRender
|
|
|
|
- (void)node:(ASDisplayNode *)node enteredRangeOfType:(ASLayoutRangeType)rangeType
|
|
{
|
|
ASDisplayNodeAssertMainThread();
|
|
ASDisplayNodeAssert(rangeType == ASLayoutRangeTypeRender, @"Render delegate should not handle other ranges");
|
|
|
|
// if node is in the working range it should not actively be in view
|
|
[node.view removeFromSuperview];
|
|
|
|
[node recursivelyDisplay];
|
|
}
|
|
|
|
- (void)node:(ASDisplayNode *)node exitedRangeOfType:(ASLayoutRangeType)rangeType
|
|
{
|
|
ASDisplayNodeAssertMainThread();
|
|
ASDisplayNodeAssert(rangeType == ASLayoutRangeTypeRender, @"Render delegate should not handle other ranges");
|
|
|
|
[node recursivelySetDisplaySuspended:YES];
|
|
[node.view removeFromSuperview];
|
|
|
|
[node recursivelyClearRendering];
|
|
}
|
|
|
|
@end
|