Skip to content

Commit a1e2a38

Browse files
committed
Add currentUIViewTransaction
1 parent 1cca4bf commit a1e2a38

File tree

6 files changed

+126
-1
lines changed

6 files changed

+126
-1
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
//
2+
// CATransactionCompletionItem.h
3+
// COpenSwiftUI
4+
5+
#ifndef CATransactionCompletionItem_h
6+
#define CATransactionCompletionItem_h
7+
8+
#include "OpenSwiftUIBase.h"
9+
10+
#if __has_include(<QuartzCore/QuartzCore.h>)
11+
12+
#import <QuartzCore/QuartzCore.h>
13+
#import "Shims/QuartzCore/QuartzCore_Private.h"
14+
15+
OPENSWIFTUI_ASSUME_NONNULL_BEGIN
16+
17+
OPENSWIFTUI_EXPORT
18+
CATransactionCompletionItem * _Nullable _CATransactionCompletionItem(void);
19+
20+
OPENSWIFTUI_ASSUME_NONNULL_END
21+
22+
#endif /* __has_include(<QuartzCore/QuartzCore.h>) */
23+
24+
#endif /* CATransactionCompletionItem_h */
25+
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
//
2+
// CATransactionCompletionItem.m
3+
// COpenSwiftUI
4+
5+
#import "CATransactionCompletionItem.h"
6+
7+
#if __has_include(<QuartzCore/QuartzCore.h>)
8+
9+
CATransactionCompletionItem *_CATransactionCompletionItem(void) {
10+
return [CATransactionCompletionItem completionItem];
11+
}
12+
13+
#endif /* __has_include(<QuartzCore/QuartzCore.h>) */
14+
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
//
2+
// QuartzCore_Private.h
3+
// COpenSwiftUI
4+
5+
#ifndef QuartzCore_Private_h
6+
#define QuartzCore_Private_h
7+
8+
#include "OpenSwiftUIBase.h"
9+
10+
#if __has_include(<QuartzCore/QuartzCore.h>)
11+
12+
#import <QuartzCore/QuartzCore.h>
13+
14+
OPENSWIFTUI_ASSUME_NONNULL_BEGIN
15+
16+
@interface CATransactionCompletionItem : NSObject
17+
+ (nullable CATransactionCompletionItem *)completionItem;
18+
- (void)invalidate;
19+
@end
20+
21+
OPENSWIFTUI_ASSUME_NONNULL_END
22+
23+
#endif /* __has_include(<QuartzCore/QuartzCore.h>) */
24+
25+
#endif /* QuartzCore_Private_h */
26+

Sources/COpenSwiftUI/Shims/UIKit/UIKit_Private.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ OPENSWIFTUI_ASSUME_NONNULL_BEGIN
3434
- (BOOL)_shouldAnimatePropertyWithKey_openswiftui_safe_wrapper:(NSString *)key OPENSWIFTUI_SWIFT_NAME(_shouldAnimateProperty(withKey:));
3535
- (void)_setFocusInteractionEnabled_openswiftui_safe_wrapper:(BOOL)enabled OPENSWIFTUI_SWIFT_NAME(_setFocusInteractionEnabled(_:));
3636
@property(nonatomic, readonly, nullable) UIViewController *_viewControllerForAncestor_openswiftui_safe_wrapper OPENSWIFTUI_SWIFT_NAME(_viewControllerForAncestor);
37+
38+
@property(class, nonatomic, readonly) BOOL _isInAnimationBlockWithAnimationsEnabled_openswiftui_safe_wrapper OPENSWIFTUI_SWIFT_NAME(_isInAnimationBlockWithAnimationsEnabled);
39+
@property(class, nonatomic, readonly) NSTimeInterval _currentAnimationDuration_openswiftui_safe_wrapper OPENSWIFTUI_SWIFT_NAME(_currentAnimationDuration);
40+
@property(class, nonatomic, readonly) NSInteger _currentAnimationCurve_openswiftui_safe_wrapper OPENSWIFTUI_SWIFT_NAME(_currentAnimationCurve);
3741
@end
3842

3943
#if OPENSWIFTUI_LINK_BACKLIGHTSERVICES

Sources/COpenSwiftUI/Shims/UIKit/UIKit_Private.m

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,21 @@ - (UIViewController *)_viewControllerForAncestor_openswiftui_safe_wrapper {
5353
OPENSWIFTUI_SAFE_WRAPPER_IMP(UIViewController *, @"_viewControllerForAncestor", nil);
5454
return func(self, selector);
5555
}
56+
57+
+ (BOOL)_isInAnimationBlockWithAnimationsEnabled_openswiftui_safe_wrapper {
58+
OPENSWIFTUI_SAFE_WRAPPER_IMP(BOOL, @"_isInAnimationBlockWithAnimationsEnabled", NO);
59+
return func(self, selector);
60+
}
61+
62+
+ (NSTimeInterval)_currentAnimationDuration_openswiftui_safe_wrapper {
63+
OPENSWIFTUI_SAFE_WRAPPER_IMP(NSTimeInterval, @"_currentAnimationDuration", 0.0);
64+
return func(self, selector);
65+
}
66+
67+
+ (NSInteger)_currentAnimationCurve_openswiftui_safe_wrapper {
68+
OPENSWIFTUI_SAFE_WRAPPER_IMP(NSInteger, @"_currentAnimationCurve", 0);
69+
return func(self, selector);
70+
}
5671
@end
5772

5873
@implementation UIViewController (OpenSwiftUI_SPI)

Sources/OpenSwiftUI/Integration/Graphic/UIKit/UIKitConversions.swift

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -424,7 +424,7 @@ extension UIUserInterfaceSizeClass {
424424
}
425425
}
426426

427-
// MARK: - CABasicAnimation Conversions
427+
// MARK: - Animation Conversions
428428

429429
extension Animation {
430430
package var caBasicAnimation: CABasicAnimation? {
@@ -459,6 +459,47 @@ extension Animation {
459459
return nil
460460
}
461461
}
462+
463+
package static func uiViewAnimation(curve: Int, duration: Double) -> Animation? {
464+
switch curve {
465+
case 0: .easeInOut(duration: duration)
466+
case 1: .easeIn(duration: duration)
467+
case 2: .easeOut(duration: duration)
468+
case 3: .linear(duration: duration)
469+
case 4: .timingCurve(0.66, 0, 0.33, 1.0, duration: duration)
470+
case 5: .coreAnimationDefault(duration: duration)
471+
case 6: .easeInOut(duration: duration)
472+
case 7: .interpolatingSpring(mass: 3.0, stiffness: 1000.0, damping: 500.0, initialVelocity: 0.0)
473+
default: nil
474+
}
475+
}
476+
}
477+
478+
// MARK: - Transaction + UIView Animation
479+
480+
extension Transaction {
481+
package static func currentUIViewTransaction(canDisableAnimations: Bool) -> Transaction? {
482+
if canDisableAnimations, !UIView.areAnimationsEnabled {
483+
var transaction = Transaction()
484+
transaction.disablesAnimations = true
485+
return transaction
486+
}
487+
guard UIView._isInAnimationBlockWithAnimationsEnabled else {
488+
return nil
489+
}
490+
let duration = UIView._currentAnimationDuration
491+
let curve = UIView._currentAnimationCurve
492+
guard let animation = Animation.uiViewAnimation(curve: curve, duration: duration) else {
493+
return nil
494+
}
495+
var transaction = Transaction(animation: animation)
496+
if let item = _CATransactionCompletionItem() {
497+
transaction.addAnimationListener {
498+
item.invalidate()
499+
}
500+
}
501+
return transaction
502+
}
462503
}
463504

464505
// WIP

0 commit comments

Comments
 (0)