This commit is contained in:
2026-09-24 16:25:22 +08:00
commit 7428184f01
1198 changed files with 314515 additions and 0 deletions
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyAccessedAPITypes</key>
<array/>
<key>NSPrivacyCollectedDataTypes</key>
<array/>
<key>NSPrivacyTracking</key>
<false/>
<key>NSPrivacyTrackingDomains</key>
<array/>
</dict>
</plist>
@@ -0,0 +1,3 @@
{
"deploymentTarget": "12"
}
@@ -0,0 +1,110 @@
// import UniversalBlurHelper from 'uts.sdk.modules.utsXdBlur.UniversalBlurHelper';
import { hexToRgb } from '../libs/color.uts'
import {XDANIMATION_FLIP3D_OPTIONS,XDANIMATION_TRANSLATE_OPTIONS,XDANIMATION_ROTATE_OPTIONS,XDANIMATION_SCALE_OPTIONS} from "../interface.uts"
import { UIView } from 'UIKit';
import { CGFloat } from 'CoreFoundation';
import { CABasicAnimation } from "QuartzCore";
export class xAnimationS {
public static translate(opts:XDANIMATION_TRANSLATE_OPTIONS){
if(opts.ele == null) return
let view = (opts.ele as UniElement).getIOSView()! as UIView
let duration_s = ((opts.duration==null?1000:(opts.duration!))/1000).toDouble()
let delay_s = ((opts.delay==null?0:(opts.delay!))/1000).toDouble()
let translation_s = (opts.translation==null?0:(opts.translation!)).toInt()
let from_s = new CGFloat((opts.from==null?0:(opts.from!)))
let len_s = new CGFloat(opts.len==null?0:(opts.len!))
let loop_s = (opts.loop==null?0:(opts.loop!)).toInt()
xdAnimation.translate(
view=view,
duration=duration_s,
delay=delay_s,
translation=translation_s,
fromLen=from_s,
len=len_s,
loop=loop_s,
start=opts.start,
end=opts.end
)
}
public static rotate(opts:XDANIMATION_ROTATE_OPTIONS){
if(opts.ele == null) return
let view = (opts.ele as UniElement).getIOSView()! as UIView
let duration_s = ((opts.duration==null?1000:(opts.duration!))/1000).toDouble()
let delay_s = ((opts.delay==null?0:(opts.delay!))/1000).toDouble()
let from_s = new CGFloat((opts.from==null?0:(opts.from!)))
let deg_s = new CGFloat(opts.deg==null?360:(opts.deg!))
let loop_s = (opts.loop==null?0:(opts.loop!)).toInt()
xdAnimation.rotate(
view=view,
duration=duration_s,
delay=delay_s,
fromDeg=from_s,
deg=deg_s,
loop=loop_s,
start=opts.start,
end=opts.end
)
}
public static scale(opts:XDANIMATION_SCALE_OPTIONS){
if(opts.ele == null) return
let view = (opts.ele as UniElement).getIOSView()! as UIView
let duration_s = ((opts.duration==null?1000:(opts.duration!))/1000).toDouble()
let delay_s = ((opts.delay==null?0:(opts.delay!))/1000).toDouble()
let direction_s = (opts.direction==null?2:(opts.direction!)).toInt()
let from_s = new CGFloat((opts.from==null?0:(opts.from!)))
let scale_s = new CGFloat(opts.scale==null?1:(opts.scale!))
let loop_s = (opts.loop==null?0:(opts.loop!)).toInt()
xdAnimation.scale(
view=view,
duration=duration_s,
delay=delay_s,
direction = direction_s,
fromScale=from_s,
scale=scale_s,
loop=loop_s,
start=opts.start,
end=opts.end
)
}
public static flip3D(opts:XDANIMATION_FLIP3D_OPTIONS){
if(opts.ele == null) return
let view = (opts.ele as UniElement).getIOSView()! as UIView
let duration_s = ((opts.duration==null?1000:(opts.duration!))/1000).toDouble()
let delay_s = ((opts.delay==null?0:(opts.delay!))/1000).toDouble()
let axis_s = (opts.axis==null?1:(opts.axis!)).toInt()
let from_s = new CGFloat((opts.from==null?0:(opts.from!)))
let deg_s = new CGFloat(opts.deg==null?360:(opts.deg!))
let cameraDistance_s = new CGFloat((opts.cameraDistance==null?12:(opts.cameraDistance!)))
let scaleZ_s = new CGFloat(opts.scaleZ==null?0.5:(opts.scaleZ!))
let loop_s = (opts.loop==null?0:(opts.loop!)).toInt()
xdAnimation.flip3D(
view=view,
duration=duration_s,
delay=delay_s,
axis = axis_s,
fromDeg=from_s,
deg=deg_s,
loop=loop_s,
cameraDistance=cameraDistance_s,
scaleZ=scaleZ_s,
start=opts.start,
end=opts.end
)
}
public static clearAnimations(ele:UniElement|null,reset:boolean = true){
if(ele == null) return
let view = (ele as UniElement).getIOSView()! as UIView
// xdAnimation.clearAnimations(view,reset)
}
}
@@ -0,0 +1,307 @@
import UIKit
import QuartzCore
//
class AnimationDelegate: NSObject, CAAnimationDelegate {
var start: (() -> Void)?
var end: (() -> Void)?
init(start: (() -> Void)?, end: (() -> Void)?) {
self.start = start
self.end = end
}
func animationDidStart(_ anim: CAAnimation) {
start?()
}
func animationDidStop(_ anim: CAAnimation, finished flag: Bool) {
end?()
}
}
// CGFloat
extension CGFloat {
func toRadians() -> CGFloat {
return self * .pi / 180.0
}
}
class xdAnimation {
//
static func translate(
view: UIView,
duration: TimeInterval = 1.0,
delay: TimeInterval = 0,
translation: Int = 0, // 0x,1y,2x,y
fromLen: CGFloat = 0,
len: CGFloat = 0,
loop: Int = 0,
start: (() -> Void)? = nil,
end: (() -> Void)? = nil
) {
let timingFunction: CAMediaTimingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
//
let animation: CAPropertyAnimation
switch translation {
case 1: // Y
let basicAnimation = CABasicAnimation(keyPath: "transform.translation.y")
basicAnimation.fromValue = fromLen
basicAnimation.toValue = len
animation = basicAnimation
case 2: // XY
let keyframeAnimation = CAKeyframeAnimation(keyPath: "position")
let path = CGMutablePath()
let startPoint = CGPoint(x: view.frame.origin.x + fromLen, y: view.frame.origin.y + fromLen)
let endPoint = CGPoint(x: view.frame.origin.x + len, y: view.frame.origin.y + len)
path.move(to: startPoint)
path.addLine(to: endPoint)
keyframeAnimation.path = path
animation = keyframeAnimation
default: // X
let basicAnimation = CABasicAnimation(keyPath: "transform.translation.x")
basicAnimation.fromValue = fromLen
basicAnimation.toValue = len
animation = basicAnimation
}
//
animation.duration = duration
animation.beginTime = CACurrentMediaTime() + delay
animation.timingFunction = timingFunction // 线
animation.isRemovedOnCompletion = false //
animation.fillMode = .forwards //
//
if loop == -1 {
animation.repeatCount = .infinity
} else {
animation.repeatCount = Float(loop)
}
//
CATransaction.begin()
CATransaction.setCompletionBlock {
end?()
}
start?()
view.layer.add(animation, forKey: "translation")
CATransaction.commit()
}
static func rotate(view: UIView,
duration: TimeInterval = 1.0,
delay: TimeInterval = 0.0,
fromDeg: CGFloat = 0.0,
deg: CGFloat = 360.0,
loop: Int = 0,
start: (() -> Void)? = nil,
end: (() -> Void)? = nil) {
//
let timingFunction: CAMediaTimingFunction = CAMediaTimingFunction(name: .linear)
let rotation = CABasicAnimation(keyPath: "transform.rotation")
rotation.fromValue = fromDeg * .pi / 180.0 //
rotation.toValue = deg * .pi / 180.0 //
rotation.duration = duration
rotation.beginTime = CACurrentMediaTime() + delay
rotation.isCumulative = true
rotation.timingFunction = timingFunction // 线
rotation.isRemovedOnCompletion = false //
rotation.fillMode = .forwards //
//
if loop == -1 {
rotation.repeatCount = .infinity
} else {
rotation.repeatCount = Float(loop)
}
//
if let startAction = start {
DispatchQueue.main.asyncAfter(deadline: .now() + delay) {
startAction()
}
}
// 使 CATransaction
CATransaction.begin()
//
CATransaction.setCompletionBlock {
end?()
}
//
view.layer.add(rotation, forKey: "rotationAnimation")
//
CATransaction.commit()
}
//
static func scale(view: UIView,
duration: TimeInterval = 1.0,
delay: TimeInterval = 0.0,
direction: Int = 0,
fromScale: CGFloat = 0.0,
scale: CGFloat = 1.0,
loop: Int = 0,
start: (() -> Void)? = nil,
end: (() -> Void)? = nil) {
//
var scaleAnimations = [CABasicAnimation]()
switch direction {
case 1: // (Y)
let scaleY = CABasicAnimation(keyPath: "transform.scale.y")
scaleY.fromValue = fromScale
scaleY.toValue = scale
scaleAnimations = [scaleY]
case 2: // XY
let scaleX = CABasicAnimation(keyPath: "transform.scale.x")
scaleX.fromValue = fromScale
scaleX.toValue = scale
let scaleY = CABasicAnimation(keyPath: "transform.scale.y")
scaleY.fromValue = fromScale
scaleY.toValue = scale
scaleAnimations = [scaleX, scaleY]
default: // (X)
let scaleX = CABasicAnimation(keyPath: "transform.scale.x")
scaleX.fromValue = fromScale
scaleX.toValue = scale
scaleAnimations = [scaleX]
}
//
for animation in scaleAnimations {
animation.duration = duration
animation.beginTime = CACurrentMediaTime() + delay
animation.isCumulative = true
animation.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut) // 线
animation.isRemovedOnCompletion = false //
animation.fillMode = .forwards //
if loop == -1 {
animation.repeatCount = .infinity
} else {
animation.repeatCount = Float(loop)
}
}
// 使 CATransaction
CATransaction.begin()
//
if let startAction = start {
DispatchQueue.main.asyncAfter(deadline: .now() + delay) {
startAction()
}
}
//
CATransaction.setCompletionBlock {
end?()
}
//
var i=0
for animation in scaleAnimations {
view.layer.add(animation, forKey: "scaleAnimation"+i.toString())
i+=1;
}
//
CATransaction.commit()
}
private func deg2rad(_ degree: CGFloat) -> CGFloat {
return degree * .pi / 180
}
// 3D
static func flip3D(
view: UIView,
duration: TimeInterval = 1.0,
delay: TimeInterval = 0.0,
axis: Int = 1,
fromDeg: CGFloat = 0.0, //
deg: CGFloat = 180.0, //
loop: Int = 0,
cameraDistance: CGFloat = 8.0,
scaleZ: CGFloat = 0.8,
start: (() -> Void)? = nil,
end: (() -> Void)? = nil) {
let adjustedDeg: CGFloat = deg
// 3D
var transform = CATransform3DIdentity
transform.m34 = -1.0 / cameraDistance
view.layer.transform = transform
//
var rotationTransform: CATransform3D
if axis == 1 { // Y
rotationTransform = CATransform3DMakeRotation(fromDeg.toRadians(), 0, 1, 0)
} else { // X
rotationTransform = CATransform3DMakeRotation(fromDeg.toRadians(), 1, 0, 0)
}
//
view.layer.transform = rotationTransform
//
UIView.animate(
withDuration: duration,
delay: delay,
options: [.curveLinear],
animations: {
start?() //
//
let finalTransform: CATransform3D
if axis == 1 { // Y
finalTransform = CATransform3DMakeRotation(adjustedDeg.toRadians(), 0, 1, 0)
} else { // X
finalTransform = CATransform3DMakeRotation(adjustedDeg.toRadians(), 1, 0, 0)
}
// Z
let scaleTransform = CATransform3DScale(finalTransform, 1, 1, scaleZ)
view.layer.transform = scaleTransform
},
completion: { finished in
if loop > 1 {
//
flip3D(
view: view,
duration: duration,
delay: delay,
axis: axis,
fromDeg: adjustedDeg,
deg: fromDeg,
loop: loop - 1,
cameraDistance: cameraDistance,
scaleZ: scaleZ,
start: start,
end: end
)
} else {
end?() //
}
}
)
}
}