mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-09-07 13:09:49 +00:00
Add old transition API back but allow call from background thread (#2135)
This commit is contained in:
parent
7ef6c0ff2c
commit
f8e135a1be
@ -115,35 +115,13 @@
|
|||||||
[self didRelayoutFromOldSize:oldSize toNewSize:self.calculatedSize];
|
[self didRelayoutFromOldSize:oldSize toNewSize:self.calculatedSize];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)transitionLayoutAnimated:(BOOL)animated
|
|
||||||
measurementCompletion:(void (^)())completion
|
|
||||||
{
|
|
||||||
CGSize oldSize = self.calculatedSize;
|
|
||||||
[super transitionLayoutAnimated:animated
|
|
||||||
measurementCompletion:^{
|
|
||||||
[self didRelayoutFromOldSize:oldSize toNewSize:self.calculatedSize];
|
|
||||||
if (completion) {
|
|
||||||
completion();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
//Deprecated
|
|
||||||
- (void)transitionLayoutWithAnimation:(BOOL)animated
|
- (void)transitionLayoutWithAnimation:(BOOL)animated
|
||||||
shouldMeasureAsync:(BOOL)shouldMeasureAsync
|
shouldMeasureAsync:(BOOL)shouldMeasureAsync
|
||||||
measurementCompletion:(void(^)())completion
|
measurementCompletion:(void(^)())completion
|
||||||
{
|
|
||||||
[self transitionLayoutAnimated:animated measurementCompletion:completion];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)transitionLayoutWithSizeRange:(ASSizeRange)constrainedSize
|
|
||||||
animated:(BOOL)animated
|
|
||||||
measurementCompletion:(void (^)())completion
|
|
||||||
{
|
{
|
||||||
CGSize oldSize = self.calculatedSize;
|
CGSize oldSize = self.calculatedSize;
|
||||||
[super transitionLayoutWithSizeRange:constrainedSize
|
[super transitionLayoutWithAnimation:animated
|
||||||
animated:animated
|
shouldMeasureAsync:shouldMeasureAsync
|
||||||
measurementCompletion:^{
|
measurementCompletion:^{
|
||||||
[self didRelayoutFromOldSize:oldSize toNewSize:self.calculatedSize];
|
[self didRelayoutFromOldSize:oldSize toNewSize:self.calculatedSize];
|
||||||
if (completion) {
|
if (completion) {
|
||||||
@ -153,13 +131,22 @@
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
//Deprecated
|
|
||||||
- (void)transitionLayoutWithSizeRange:(ASSizeRange)constrainedSize
|
- (void)transitionLayoutWithSizeRange:(ASSizeRange)constrainedSize
|
||||||
animated:(BOOL)animated
|
animated:(BOOL)animated
|
||||||
shouldMeasureAsync:(BOOL)shouldMeasureAsync
|
shouldMeasureAsync:(BOOL)shouldMeasureAsync
|
||||||
measurementCompletion:(void(^)())completion
|
measurementCompletion:(void(^)())completion
|
||||||
{
|
{
|
||||||
[self transitionLayoutWithSizeRange:constrainedSize animated:animated measurementCompletion:completion];
|
CGSize oldSize = self.calculatedSize;
|
||||||
|
[super transitionLayoutWithSizeRange:constrainedSize
|
||||||
|
animated:animated
|
||||||
|
shouldMeasureAsync:shouldMeasureAsync
|
||||||
|
measurementCompletion:^{
|
||||||
|
[self didRelayoutFromOldSize:oldSize toNewSize:self.calculatedSize];
|
||||||
|
if (completion) {
|
||||||
|
completion();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)didRelayoutFromOldSize:(CGSize)oldSize toNewSize:(CGSize)newSize
|
- (void)didRelayoutFromOldSize:(CGSize)oldSize toNewSize:(CGSize)newSize
|
||||||
|
@ -54,47 +54,6 @@
|
|||||||
*/
|
*/
|
||||||
- (void)loadStateDidChange:(BOOL)inLoadState ASDISPLAYNODE_REQUIRES_SUPER ASDISPLAYNODE_DEPRECATED;
|
- (void)loadStateDidChange:(BOOL)inLoadState ASDISPLAYNODE_REQUIRES_SUPER ASDISPLAYNODE_DEPRECATED;
|
||||||
|
|
||||||
/**
|
|
||||||
* @abstract Transitions the current layout with a new constrained size. Must be called on main thread.
|
|
||||||
*
|
|
||||||
* @param animated Animation is optional, but will still proceed through your `animateLayoutTransition` implementation with `isAnimated == NO`.
|
|
||||||
* @param shouldMeasureAsync Measure the layout asynchronously.
|
|
||||||
* @param measurementCompletion Optional completion block called only if a new layout is calculated.
|
|
||||||
* It is called on main, right after the measurement and before -animateLayoutTransition:.
|
|
||||||
*
|
|
||||||
* @discussion If the passed constrainedSize is the the same as the node's current constrained size, this method is noop.
|
|
||||||
*
|
|
||||||
* @see animateLayoutTransition:
|
|
||||||
*
|
|
||||||
* @deprecated Deprecated in version 2.0: Use transitionLayoutWithSizeRange:animated:measurementCompletion:.
|
|
||||||
* shouldMeasureAsync is enabled by default now.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
- (void)transitionLayoutWithSizeRange:(ASSizeRange)constrainedSize
|
|
||||||
animated:(BOOL)animated
|
|
||||||
shouldMeasureAsync:(BOOL)shouldMeasureAsync
|
|
||||||
measurementCompletion:(nullable void(^)())completion ASDISPLAYNODE_DEPRECATED;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @abstract Invalidates the current layout and begins a relayout of the node with the current `constrainedSize`. Must be called on main thread.
|
|
||||||
*
|
|
||||||
* @discussion It is called right after the measurement and before -animateLayoutTransition:.
|
|
||||||
*
|
|
||||||
* @param animated Animation is optional, but will still proceed through your `animateLayoutTransition` implementation with `isAnimated == NO`.
|
|
||||||
* @param shouldMeasureAsync Measure the layout asynchronously.
|
|
||||||
* @param measurementCompletion Optional completion block called only if a new layout is calculated.
|
|
||||||
*
|
|
||||||
* @see animateLayoutTransition:
|
|
||||||
*
|
|
||||||
* @deprecated Deprecated in version 2.0: Use transitionLayoutAnimated:measurementCompletion:
|
|
||||||
* shouldMeasureAsync is enabled by default now.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
- (void)transitionLayoutWithAnimation:(BOOL)animated
|
|
||||||
shouldMeasureAsync:(BOOL)shouldMeasureAsync
|
|
||||||
measurementCompletion:(nullable void(^)())completion ASDISPLAYNODE_DEPRECATED;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @abstract Cancels all performing layout transitions. Can be called on any thread.
|
* @abstract Cancels all performing layout transitions. Can be called on any thread.
|
||||||
*
|
*
|
||||||
|
@ -782,27 +782,34 @@ NS_ASSUME_NONNULL_BEGIN
|
|||||||
* @param animated Animation is optional, but will still proceed through your `animateLayoutTransition` implementation with `isAnimated == NO`.
|
* @param animated Animation is optional, but will still proceed through your `animateLayoutTransition` implementation with `isAnimated == NO`.
|
||||||
* @param shouldMeasureAsync Measure the layout asynchronously.
|
* @param shouldMeasureAsync Measure the layout asynchronously.
|
||||||
* @param measurementCompletion Optional completion block called only if a new layout is calculated.
|
* @param measurementCompletion Optional completion block called only if a new layout is calculated.
|
||||||
|
* It is called on main, right after the measurement and before -animateLayoutTransition:.
|
||||||
*
|
*
|
||||||
* @discussion It is called on main, right after the measurement and before -animateLayoutTransition:. If the passed constrainedSize is the the same as the node's current constrained size, this method is noop.
|
* @discussion If the passed constrainedSize is the the same as the node's current constrained size, this method is noop. If passed YES to shouldMeasureAsync it's guaranteed that measurement is happening on a background thread, otherwise measaurement will happen on the thread that the method was called on. The measurementCompletion callback is always called on the main thread right after the measurement and before -animateLayoutTransition:.
|
||||||
*
|
*
|
||||||
* @see animateLayoutTransition:
|
* @see animateLayoutTransition:
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
- (void)transitionLayoutWithSizeRange:(ASSizeRange)constrainedSize
|
- (void)transitionLayoutWithSizeRange:(ASSizeRange)constrainedSize
|
||||||
animated:(BOOL)animated
|
animated:(BOOL)animated
|
||||||
|
shouldMeasureAsync:(BOOL)shouldMeasureAsync
|
||||||
measurementCompletion:(nullable void(^)())completion;
|
measurementCompletion:(nullable void(^)())completion;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @abstract Invalidates the current layout and begins a relayout of the node with the current `constrainedSize`. Must be called on main thread.
|
* @abstract Invalidates the current layout and begins a relayout of the node with the current `constrainedSize`. Must be called on main thread.
|
||||||
*
|
*
|
||||||
* @discussion It is called right after the measurement and before -animateLayoutTransition:.
|
* @discussion It is called right after the measurement and before -animateLayoutTransition:.
|
||||||
*
|
*
|
||||||
* @param animated Animation is optional, but will still proceed through your `animateLayoutTransition` implementation with `isAnimated == NO`.
|
* @param animated Animation is optional, but will still proceed through your `animateLayoutTransition` implementation with `isAnimated == NO`.
|
||||||
|
* @param shouldMeasureAsync Measure the layout asynchronously.
|
||||||
* @param measurementCompletion Optional completion block called only if a new layout is calculated.
|
* @param measurementCompletion Optional completion block called only if a new layout is calculated.
|
||||||
*
|
*
|
||||||
* @see animateLayoutTransition:
|
* @see animateLayoutTransition:
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
- (void)transitionLayoutAnimated:(BOOL)animated measurementCompletion:(nullable void(^)())completion;
|
- (void)transitionLayoutWithAnimation:(BOOL)animated
|
||||||
|
shouldMeasureAsync:(BOOL)shouldMeasureAsync
|
||||||
|
measurementCompletion:(nullable void(^)())completion;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @abstract Cancels all performing layout transitions. Can be called on any thread.
|
* @abstract Cancels all performing layout transitions. Can be called on any thread.
|
||||||
|
@ -723,7 +723,9 @@ static ASDisplayNodeMethodOverrides GetASDisplayNodeMethodOverrides(Class c)
|
|||||||
|
|
||||||
#pragma mark - Layout Transition
|
#pragma mark - Layout Transition
|
||||||
|
|
||||||
- (void)transitionLayoutAnimated:(BOOL)animated measurementCompletion:(void (^)())completion
|
- (void)transitionLayoutWithAnimation:(BOOL)animated
|
||||||
|
shouldMeasureAsync:(BOOL)shouldMeasureAsync
|
||||||
|
measurementCompletion:(void(^)())completion
|
||||||
{
|
{
|
||||||
if (_calculatedLayout == nil) {
|
if (_calculatedLayout == nil) {
|
||||||
// constrainedSizeRange returns a struct and is invalid to call on nil.
|
// constrainedSizeRange returns a struct and is invalid to call on nil.
|
||||||
@ -734,15 +736,18 @@ static ASDisplayNodeMethodOverrides GetASDisplayNodeMethodOverrides(Class c)
|
|||||||
[self invalidateCalculatedLayout];
|
[self invalidateCalculatedLayout];
|
||||||
[self transitionLayoutWithSizeRange:_calculatedLayout.constrainedSizeRange
|
[self transitionLayoutWithSizeRange:_calculatedLayout.constrainedSizeRange
|
||||||
animated:animated
|
animated:animated
|
||||||
|
shouldMeasureAsync:shouldMeasureAsync
|
||||||
measurementCompletion:completion];
|
measurementCompletion:completion];
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)transitionLayoutWithSizeRange:(ASSizeRange)constrainedSize
|
- (void)transitionLayoutWithSizeRange:(ASSizeRange)constrainedSize
|
||||||
animated:(BOOL)animated
|
animated:(BOOL)animated
|
||||||
measurementCompletion:(void (^)())completion
|
shouldMeasureAsync:(BOOL)shouldMeasureAsync
|
||||||
|
measurementCompletion:(void(^)())completion
|
||||||
{
|
{
|
||||||
ASDisplayNodeAssertMainThread();
|
// Passed constrainedSize is the the same as the node's current constrained size it's a noop
|
||||||
if (! [self shouldMeasureWithSizeRange:constrainedSize]) {
|
if ([self shouldMeasureWithSizeRange:constrainedSize] == NO) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -759,7 +764,8 @@ static ASDisplayNodeMethodOverrides GetASDisplayNodeMethodOverrides(Class c)
|
|||||||
node.pendingTransitionID = transitionID;
|
node.pendingTransitionID = transitionID;
|
||||||
});
|
});
|
||||||
|
|
||||||
ASPerformBlockOnBackgroundThread(^{
|
|
||||||
|
void (^transitionBlock)(void) = ^{
|
||||||
if ([self _shouldAbortTransitionWithID:transitionID]) {
|
if ([self _shouldAbortTransitionWithID:transitionID]) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -821,7 +827,13 @@ static ASDisplayNodeMethodOverrides GetASDisplayNodeMethodOverrides(Class c)
|
|||||||
// Kick off animating the layout transition
|
// Kick off animating the layout transition
|
||||||
[self animateLayoutTransition:_pendingLayoutTransitionContext];
|
[self animateLayoutTransition:_pendingLayoutTransitionContext];
|
||||||
});
|
});
|
||||||
});
|
};
|
||||||
|
|
||||||
|
if (shouldMeasureAsync) {
|
||||||
|
ASPerformBlockOnBackgroundThread(transitionBlock);
|
||||||
|
} else {
|
||||||
|
transitionBlock();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)cancelLayoutTransition
|
- (void)cancelLayoutTransition
|
||||||
@ -3317,21 +3329,6 @@ static const char *ASDisplayNodeAssociatedNodeKey = "ASAssociatedNode";
|
|||||||
|
|
||||||
@implementation ASDisplayNode (Deprecated)
|
@implementation ASDisplayNode (Deprecated)
|
||||||
|
|
||||||
- (void)transitionLayoutWithAnimation:(BOOL)animated
|
|
||||||
shouldMeasureAsync:(BOOL)shouldMeasureAsync
|
|
||||||
measurementCompletion:(void(^)())completion
|
|
||||||
{
|
|
||||||
[self transitionLayoutAnimated:animated measurementCompletion:completion];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)transitionLayoutWithSizeRange:(ASSizeRange)constrainedSize
|
|
||||||
animated:(BOOL)animated
|
|
||||||
shouldMeasureAsync:(BOOL)shouldMeasureAsync
|
|
||||||
measurementCompletion:(void(^)())completion
|
|
||||||
{
|
|
||||||
[self transitionLayoutWithSizeRange:constrainedSize animated:animated measurementCompletion:completion];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)cancelLayoutTransitionsInProgress
|
- (void)cancelLayoutTransitionsInProgress
|
||||||
{
|
{
|
||||||
[self cancelLayoutTransition];
|
[self cancelLayoutTransition];
|
||||||
|
@ -126,7 +126,7 @@
|
|||||||
|
|
||||||
XCTestExpectation *expectation = [self expectationWithDescription:@"Call measurement completion block on main"];
|
XCTestExpectation *expectation = [self expectationWithDescription:@"Call measurement completion block on main"];
|
||||||
|
|
||||||
[displayNode transitionLayoutWithSizeRange:ASSizeRangeMake(CGSizeZero, CGSizeZero) animated:YES measurementCompletion:^{
|
[displayNode transitionLayoutWithSizeRange:ASSizeRangeMake(CGSizeZero, CGSizeZero) animated:YES shouldMeasureAsync:YES measurementCompletion:^{
|
||||||
XCTAssertTrue(ASDisplayNodeThreadIsMain(), @"Measurement completion block should be called on main thread");
|
XCTAssertTrue(ASDisplayNodeThreadIsMain(), @"Measurement completion block should be called on main thread");
|
||||||
[expectation fulfill];
|
[expectation fulfill];
|
||||||
}];
|
}];
|
||||||
@ -207,7 +207,7 @@
|
|||||||
|
|
||||||
node.layoutState = @2;
|
node.layoutState = @2;
|
||||||
[node invalidateCalculatedLayout];
|
[node invalidateCalculatedLayout];
|
||||||
[node transitionLayoutAnimated:YES measurementCompletion:^{
|
[node transitionLayoutWithAnimation:YES shouldMeasureAsync:YES measurementCompletion:^{
|
||||||
// Push this to the next runloop to let async insertion / removing of nodes finished before checking
|
// Push this to the next runloop to let async insertion / removing of nodes finished before checking
|
||||||
dispatch_async(dispatch_get_main_queue(), ^{
|
dispatch_async(dispatch_get_main_queue(), ^{
|
||||||
XCTAssertEqual(node.subnodes[0], node2);
|
XCTAssertEqual(node.subnodes[0], node2);
|
||||||
|
@ -89,7 +89,7 @@
|
|||||||
{
|
{
|
||||||
self.enabled = !self.enabled;
|
self.enabled = !self.enabled;
|
||||||
|
|
||||||
[self transitionLayoutAnimated:YES measurementCompletion:nil];
|
[self transitionLayoutWithAnimation:YES shouldMeasureAsync:NO measurementCompletion:nil];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user