mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-22 14:20:20 +00:00
Merge commit '565da7d4935740d12fc204aa061faf093831da1e'
# Conflicts: # AsyncDisplayKit.xcodeproj/project.pbxproj # AsyncDisplayKit.xcodeproj/xcshareddata/xcschemes/AsyncDisplayKit.xcscheme # Source/ASDisplayNode.mm # Source/ASEditableTextNode.h # Source/ASImageNode.mm # Source/ASMapNode.h # Source/ASMapNode.mm # Source/Base/ASAssert.m # Source/Details/ASPhotosFrameworkImageRequest.h # Source/Details/ASPhotosFrameworkImageRequest.m # Source/Layout/ASLayoutElement.mm
This commit is contained in:
@@ -2,17 +2,9 @@
|
||||
// ASCollectionNode.mm
|
||||
// Texture
|
||||
//
|
||||
// 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 /ASDK-Licenses directory of this source tree. An additional
|
||||
// grant of patent rights can be found in the PATENTS file in the same directory.
|
||||
//
|
||||
// Modifications to this file made after 4/13/2017 are: Copyright (c) 2017-present,
|
||||
// Pinterest, Inc. Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
// 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
|
||||
//
|
||||
|
||||
#ifndef MINIMAL_ASDK
|
||||
@@ -39,9 +31,12 @@
|
||||
|
||||
#pragma mark - _ASCollectionPendingState
|
||||
|
||||
@interface _ASCollectionPendingState : NSObject
|
||||
@property (weak, nonatomic) id <ASCollectionDelegate> delegate;
|
||||
@property (weak, nonatomic) id <ASCollectionDataSource> dataSource;
|
||||
@interface _ASCollectionPendingState : NSObject {
|
||||
@public
|
||||
std::vector<std::vector<ASRangeTuningParameters>> _tuningParameters;
|
||||
}
|
||||
@property (nonatomic, weak) id <ASCollectionDelegate> delegate;
|
||||
@property (nonatomic, weak) id <ASCollectionDataSource> dataSource;
|
||||
@property (nonatomic) UICollectionViewLayout *collectionViewLayout;
|
||||
@property (nonatomic) ASLayoutRangeMode rangeMode;
|
||||
@property (nonatomic) BOOL allowsSelection; // default is YES
|
||||
@@ -49,7 +44,7 @@
|
||||
@property (nonatomic) BOOL inverted; //default is NO
|
||||
@property (nonatomic) BOOL usesSynchronousDataLoading;
|
||||
@property (nonatomic) CGFloat leadingScreensForBatching;
|
||||
@property (weak, nonatomic) id <ASCollectionViewLayoutInspecting> layoutInspector;
|
||||
@property (nonatomic, weak) id <ASCollectionViewLayoutInspecting> layoutInspector;
|
||||
@property (nonatomic) BOOL alwaysBounceVertical;
|
||||
@property (nonatomic) BOOL alwaysBounceHorizontal;
|
||||
@property (nonatomic) UIEdgeInsets contentInset;
|
||||
@@ -61,11 +56,14 @@
|
||||
|
||||
@implementation _ASCollectionPendingState
|
||||
|
||||
#pragma mark Lifecycle
|
||||
|
||||
- (instancetype)init
|
||||
{
|
||||
self = [super init];
|
||||
if (self) {
|
||||
_rangeMode = ASLayoutRangeModeUnspecified;
|
||||
_tuningParameters = std::vector<std::vector<ASRangeTuningParameters>> (ASLayoutRangeModeCount, std::vector<ASRangeTuningParameters> (ASLayoutRangeTypeCount, ASRangeTuningParametersZero));
|
||||
_allowsSelection = YES;
|
||||
_allowsMultipleSelection = NO;
|
||||
_inverted = NO;
|
||||
@@ -75,23 +73,8 @@
|
||||
}
|
||||
return self;
|
||||
}
|
||||
@end
|
||||
|
||||
// TODO: Add support for tuning parameters in the pending state
|
||||
#if 0 // This is not used yet, but will provide a way to avoid creating the view to set range values.
|
||||
@implementation _ASCollectionPendingState {
|
||||
std::vector<std::vector<ASRangeTuningParameters>> _tuningParameters;
|
||||
}
|
||||
|
||||
- (instancetype)init
|
||||
{
|
||||
self = [super init];
|
||||
if (self) {
|
||||
_tuningParameters = std::vector<std::vector<ASRangeTuningParameters>> (ASLayoutRangeModeCount, std::vector<ASRangeTuningParameters> (ASLayoutRangeTypeCount));
|
||||
_rangeMode = ASLayoutRangeModeUnspecified;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
#pragma mark Tuning Parameters
|
||||
|
||||
- (ASRangeTuningParameters)tuningParametersForRangeType:(ASLayoutRangeType)rangeType
|
||||
{
|
||||
@@ -116,7 +99,6 @@
|
||||
}
|
||||
|
||||
@end
|
||||
#endif
|
||||
|
||||
#pragma mark - ASCollectionNode
|
||||
|
||||
@@ -127,6 +109,7 @@
|
||||
id<ASBatchFetchingDelegate> _batchFetchingDelegate;
|
||||
}
|
||||
@property (nonatomic) _ASCollectionPendingState *pendingState;
|
||||
@property (nonatomic, weak) ASRangeController *rangeController;
|
||||
@end
|
||||
|
||||
@implementation ASCollectionNode
|
||||
@@ -197,17 +180,21 @@
|
||||
|
||||
ASCollectionView *view = self.view;
|
||||
view.collectionNode = self;
|
||||
|
||||
_rangeController = view.rangeController;
|
||||
|
||||
if (_pendingState) {
|
||||
_ASCollectionPendingState *pendingState = _pendingState;
|
||||
self.pendingState = nil;
|
||||
view.asyncDelegate = pendingState.delegate;
|
||||
view.asyncDataSource = pendingState.dataSource;
|
||||
view.inverted = pendingState.inverted;
|
||||
view.allowsSelection = pendingState.allowsSelection;
|
||||
view.allowsMultipleSelection = pendingState.allowsMultipleSelection;
|
||||
view.usesSynchronousDataLoading = pendingState.usesSynchronousDataLoading;
|
||||
view.layoutInspector = pendingState.layoutInspector;
|
||||
self.pendingState = nil;
|
||||
view.asyncDelegate = pendingState.delegate;
|
||||
view.asyncDataSource = pendingState.dataSource;
|
||||
view.inverted = pendingState.inverted;
|
||||
view.allowsSelection = pendingState.allowsSelection;
|
||||
view.allowsMultipleSelection = pendingState.allowsMultipleSelection;
|
||||
view.usesSynchronousDataLoading = pendingState.usesSynchronousDataLoading;
|
||||
view.layoutInspector = pendingState.layoutInspector;
|
||||
view.showsVerticalScrollIndicator = pendingState.showsVerticalScrollIndicator;
|
||||
view.showsHorizontalScrollIndicator = pendingState.showsHorizontalScrollIndicator;
|
||||
|
||||
// Only apply these flags if they're enabled; the view might come with them turned on.
|
||||
if (pendingState.alwaysBounceVertical) {
|
||||
@@ -226,9 +213,24 @@
|
||||
if (!CGPointEqualToPoint(contentOffset, CGPointZero)) {
|
||||
[view setContentOffset:contentOffset animated:pendingState.animatesContentOffset];
|
||||
}
|
||||
|
||||
|
||||
let tuningParametersVector = pendingState->_tuningParameters;
|
||||
let tuningParametersVectorSize = tuningParametersVector.size();
|
||||
for (NSInteger rangeMode = 0; rangeMode < tuningParametersVectorSize; rangeMode++) {
|
||||
let tuningparametersRangeModeVector = tuningParametersVector[rangeMode];
|
||||
let tuningParametersVectorRangeModeSize = tuningparametersRangeModeVector.size();
|
||||
for (NSInteger rangeType = 0; rangeType < tuningParametersVectorRangeModeSize; rangeType++) {
|
||||
ASRangeTuningParameters tuningParameters = tuningparametersRangeModeVector[rangeType];
|
||||
if (!ASRangeTuningParametersEqualToRangeTuningParameters(tuningParameters, ASRangeTuningParametersZero)) {
|
||||
[_rangeController setTuningParameters:tuningParameters
|
||||
forRangeMode:(ASLayoutRangeMode)rangeMode
|
||||
rangeType:(ASLayoutRangeType)rangeType];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (pendingState.rangeMode != ASLayoutRangeModeUnspecified) {
|
||||
[view.rangeController updateCurrentRangeWithMode:pendingState.rangeMode];
|
||||
[_rangeController updateCurrentRangeWithMode:pendingState.rangeMode];
|
||||
}
|
||||
|
||||
// Don't need to set collectionViewLayout to the view as the layout was already used to init the view in view block.
|
||||
@@ -260,7 +262,7 @@
|
||||
// We can get rid of this call later when ASDataController, ASRangeController and ASCollectionLayout can operate without the view.
|
||||
// TODO (ASCL) If this node supports async layout, kick off the initial data load without allocating the view
|
||||
if (ASHierarchyStateIncludesRangeManaged(self.hierarchyState) && CGRectEqualToRect(self.bounds, CGRectZero) == NO) {
|
||||
[[self view] layoutIfNeeded];
|
||||
[self.view layoutIfNeeded];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -292,12 +294,6 @@
|
||||
return self.view.dataController;
|
||||
}
|
||||
|
||||
// TODO: Implement this without the view.
|
||||
- (ASRangeController *)rangeController
|
||||
{
|
||||
return self.view.rangeController;
|
||||
}
|
||||
|
||||
- (_ASCollectionPendingState *)pendingState
|
||||
{
|
||||
if (!_pendingState && ![self isNodeLoaded]) {
|
||||
@@ -654,22 +650,30 @@
|
||||
|
||||
- (ASRangeTuningParameters)tuningParametersForRangeType:(ASLayoutRangeType)rangeType
|
||||
{
|
||||
return [self.rangeController tuningParametersForRangeMode:ASLayoutRangeModeFull rangeType:rangeType];
|
||||
return [self tuningParametersForRangeMode:ASLayoutRangeModeFull rangeType:rangeType];
|
||||
}
|
||||
|
||||
- (void)setTuningParameters:(ASRangeTuningParameters)tuningParameters forRangeType:(ASLayoutRangeType)rangeType
|
||||
{
|
||||
[self.rangeController setTuningParameters:tuningParameters forRangeMode:ASLayoutRangeModeFull rangeType:rangeType];
|
||||
[self setTuningParameters:tuningParameters forRangeMode:ASLayoutRangeModeFull rangeType:rangeType];
|
||||
}
|
||||
|
||||
- (ASRangeTuningParameters)tuningParametersForRangeMode:(ASLayoutRangeMode)rangeMode rangeType:(ASLayoutRangeType)rangeType
|
||||
{
|
||||
return [self.rangeController tuningParametersForRangeMode:rangeMode rangeType:rangeType];
|
||||
if ([self pendingState]) {
|
||||
return [_pendingState tuningParametersForRangeMode:rangeMode rangeType:rangeType];
|
||||
} else {
|
||||
return [self.rangeController tuningParametersForRangeMode:rangeMode rangeType:rangeType];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setTuningParameters:(ASRangeTuningParameters)tuningParameters forRangeMode:(ASLayoutRangeMode)rangeMode rangeType:(ASLayoutRangeType)rangeType
|
||||
{
|
||||
return [self.rangeController setTuningParameters:tuningParameters forRangeMode:rangeMode rangeType:rangeType];
|
||||
if ([self pendingState]) {
|
||||
[_pendingState setTuningParameters:tuningParameters forRangeMode:rangeMode rangeType:rangeType];
|
||||
} else {
|
||||
return [self.rangeController setTuningParameters:tuningParameters forRangeMode:rangeMode rangeType:rangeType];
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - Selection
|
||||
@@ -817,7 +821,7 @@
|
||||
[self.view registerSupplementaryNodeOfKind:elementKind];
|
||||
}
|
||||
|
||||
- (void)performBatchAnimated:(BOOL)animated updates:(void (^)())updates completion:(void (^)(BOOL))completion
|
||||
- (void)performBatchAnimated:(BOOL)animated updates:(NS_NOESCAPE void (^)())updates completion:(void (^)(BOOL))completion
|
||||
{
|
||||
ASDisplayNodeAssertMainThread();
|
||||
if (self.nodeLoaded) {
|
||||
@@ -832,7 +836,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
- (void)performBatchUpdates:(void (^)())updates completion:(void (^)(BOOL))completion
|
||||
- (void)performBatchUpdates:(NS_NOESCAPE void (^)())updates completion:(void (^)(BOOL))completion
|
||||
{
|
||||
[self performBatchAnimated:UIView.areAnimationsEnabled updates:updates completion:completion];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user