mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-22 14:20:20 +00:00
Merge branch 'master' into update-objc
Conflicts: AsyncDisplayKit/ASDisplayNodeExtras.h AsyncDisplayKit/Details/ASTextNodeRenderer.h AsyncDisplayKit/Details/ASTextNodeShadower.h
This commit is contained in:
@@ -10,16 +10,42 @@
|
||||
|
||||
#import "ASDisplayNodeInternal.h"
|
||||
|
||||
ASDisplayNode *ASLayerToDisplayNode(CALayer *layer)
|
||||
extern ASDisplayNode *ASLayerToDisplayNode(CALayer *layer)
|
||||
{
|
||||
return layer.asyncdisplaykit_node;
|
||||
}
|
||||
|
||||
ASDisplayNode *ASViewToDisplayNode(UIView *view)
|
||||
extern ASDisplayNode *ASViewToDisplayNode(UIView *view)
|
||||
{
|
||||
return view.asyncdisplaykit_node;
|
||||
}
|
||||
|
||||
extern void ASDisplayNodePerformBlockOnEveryNode(CALayer *layer, ASDisplayNode *node, void(^block)(ASDisplayNode *node))
|
||||
{
|
||||
if (!node) {
|
||||
ASDisplayNodeCAssertNotNil(layer, @"Cannot recursively perform with nil node and nil layer");
|
||||
ASDisplayNodeCAssertMainThread();
|
||||
node = ASLayerToDisplayNode(layer);
|
||||
}
|
||||
|
||||
if (node) {
|
||||
block(node);
|
||||
}
|
||||
if (!layer && [node isNodeLoaded]) {
|
||||
layer = node.layer;
|
||||
}
|
||||
|
||||
if (layer) {
|
||||
for (CALayer *sublayer in [layer sublayers]) {
|
||||
ASDisplayNodePerformBlockOnEveryNode(sublayer, nil, block);
|
||||
}
|
||||
} else if (node) {
|
||||
for (ASDisplayNode *subnode in [node subnodes]) {
|
||||
ASDisplayNodePerformBlockOnEveryNode(nil, subnode, block);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
id ASDisplayNodeFind(ASDisplayNode *node, BOOL (^block)(ASDisplayNode *node))
|
||||
{
|
||||
CALayer *layer = node.layer;
|
||||
@@ -122,6 +148,45 @@ extern __kindof ASDisplayNode * ASDisplayNodeFindFirstSubnodeOfClass(ASDisplayNo
|
||||
});
|
||||
}
|
||||
|
||||
static inline BOOL _ASDisplayNodeIsAncestorOfDisplayNode(ASDisplayNode *possibleAncestor, ASDisplayNode *possibleDescendent)
|
||||
{
|
||||
ASDisplayNode *supernode = possibleDescendent;
|
||||
while (supernode) {
|
||||
if (supernode == possibleAncestor) {
|
||||
return YES;
|
||||
}
|
||||
supernode = supernode.supernode;
|
||||
}
|
||||
|
||||
return NO;
|
||||
}
|
||||
|
||||
extern ASDisplayNode *ASDisplayNodeFindClosestCommonAncestor(ASDisplayNode *node1, ASDisplayNode *node2)
|
||||
{
|
||||
ASDisplayNode *possibleAncestor = node1;
|
||||
while (possibleAncestor) {
|
||||
if (_ASDisplayNodeIsAncestorOfDisplayNode(possibleAncestor, node2)) {
|
||||
break;
|
||||
}
|
||||
possibleAncestor = possibleAncestor.supernode;
|
||||
}
|
||||
|
||||
ASDisplayNodeCAssertNotNil(possibleAncestor, @"Could not find a common ancestor between node1: %@ and node2: %@", node1, node2);
|
||||
return possibleAncestor;
|
||||
}
|
||||
|
||||
extern ASDisplayNode *ASDisplayNodeUltimateParentOfNode(ASDisplayNode *node)
|
||||
{
|
||||
// node <- supernode on each loop
|
||||
// previous <- node on each loop where node is not nil
|
||||
// previous is the final non-nil value of supernode, i.e. the root node
|
||||
ASDisplayNode *previousNode = node;
|
||||
while ((node = [node supernode])) {
|
||||
previousNode = node;
|
||||
}
|
||||
return previousNode;
|
||||
}
|
||||
|
||||
#pragma mark - Placeholders
|
||||
|
||||
UIColor *ASDisplayNodeDefaultPlaceholderColor()
|
||||
|
||||
Reference in New Issue
Block a user