Swiftgram/Source/Private/ASTipsWindow.m
appleguy 465abb1ded [License] Simplify the Texture license to be pure Apache 2 (removing ASDK-Licenses). (#1077)
* [License] Simplify the Texture license to be pure Apache 2 (removing ASDK-Licenses)

With permission of the Facebook Open Source team, we are simplifying the Texture
license so that clients can rely on the Apache 2 terms that most of Texture is
already covered by. This means that code originally forked from AsyncDisplayKit
will be re-licensed from "BSD 3-clause + PATENTS v2" to Apache 2 without a
PATENTS file.

After getting confirmation that the updates to these core files look good, we'll
propagate this new license header to all files (in this same PR) and get sign-off
from all parties before landing.

* [License] Update all Texture source files to be pure Apache 2.

* Changelog entry for Apache 2 license update.

* Revert "[License] Update all Texture source files to be pure Apache 2."

This reverts commit ffa0fbbba9717d871dd16c4b07539f2f8208fc2b.

* [License] Update all Texture source files to be pure Apache 2, maintaining copyrights.

* [License] Update CONTRIBUTING, README, Podspec & Dangerfile.
2018-08-28 07:39:18 -07:00

99 lines
2.6 KiB
Objective-C

//
// ASTipsWindow.m
// 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 "ASTipsWindow.h"
#if AS_ENABLE_TIPS
#import <AsyncDisplayKit/ASDisplayNodeTipState.h>
#import <AsyncDisplayKit/ASTipNode.h>
#import <AsyncDisplayKit/ASTip.h>
#import <AsyncDisplayKit/AsyncDisplayKit+Tips.h>
@interface ASTipsWindow ()
@property (nonatomic, readonly) ASDisplayNode *node;
@end
@implementation ASTipsWindow
- (instancetype)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame]) {
/**
* UIKit throws an exception if you don't add a root view controller to a window,
* but if the window isn't key, then it doesn't manage the root view controller correctly!
*
* So we set a dummy root view controller and hide it.
*/
self.rootViewController = [UIViewController new];
self.rootViewController.view.hidden = YES;
_node = [[ASDisplayNode alloc] init];
[self addSubnode:_node];
self.windowLevel = UIWindowLevelNormal + 1;
self.opaque = NO;
}
return self;
}
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
UIView *result = [super hitTest:point withEvent:event];
// Ignore touches unless they hit one of my node's subnodes
if (result == _node.view) {
return nil;
}
return result;
}
- (void)setMainWindow:(UIWindow *)mainWindow
{
_mainWindow = mainWindow;
for (ASDisplayNode *node in _node.subnodes) {
[node removeFromSupernode];
}
}
- (void)didTapTipNode:(ASTipNode *)tipNode
{
ASDisplayNode.tipDisplayBlock(tipNode.tip.node, tipNode.tip.text);
}
- (void)layoutSubviews
{
[super layoutSubviews];
_node.frame = self.bounds;
// Ensure the main window is laid out first.
[self.mainWindow layoutIfNeeded];
NSMutableSet *tipNodesToRemove = [NSMutableSet setWithArray:_node.subnodes];
for (ASDisplayNodeTipState *tipState in [_nodeToTipStates objectEnumerator]) {
ASDisplayNode *node = tipState.node;
ASTipNode *tipNode = tipState.tipNode;
[tipNodesToRemove removeObject:tipNode];
CGRect rect = node.bounds;
rect = [node.view convertRect:rect toView:nil];
rect = [self convertRect:rect fromView:nil];
tipNode.frame = rect;
if (tipNode.supernode != _node) {
[_node addSubnode:tipNode];
}
}
// Clean up any tip nodes whose target nodes have disappeared.
for (ASTipNode *tipNode in tipNodesToRemove) {
[tipNode removeFromSupernode];
}
}
@end
#endif // AS_ENABLE_TIPS