Input node improvements

This commit is contained in:
Ali
2022-06-28 22:54:05 +02:00
parent 575605f4d0
commit 131be5aaab
51 changed files with 2586 additions and 1363 deletions

View File

@@ -271,7 +271,9 @@ open class ContextControllerSourceView: UIView {
public weak var additionalActivationProgressLayer: CALayer?
public var targetNodeForActivationProgress: ASDisplayNode?
public var targetViewForActivationProgress: UIView?
public var targetLayerForActivationProgress: CALayer?
public var targetNodeForActivationProgressContentRect: CGRect?
public var useSublayerTransformForActivation: Bool = true
override public init(frame: CGRect) {
super.init(frame: frame)
@@ -297,35 +299,42 @@ open class ContextControllerSourceView: UIView {
if let customActivationProgress = strongSelf.customActivationProgress {
customActivationProgress(progress, update)
} else if strongSelf.animateScale {
let targetView: UIView
let targetLayer: CALayer
let targetContentRect: CGRect
if let targetNodeForActivationProgress = strongSelf.targetNodeForActivationProgress {
targetView = targetNodeForActivationProgress.view
targetLayer = targetNodeForActivationProgress.layer
if let targetNodeForActivationProgressContentRect = strongSelf.targetNodeForActivationProgressContentRect {
targetContentRect = targetNodeForActivationProgressContentRect
} else {
targetContentRect = CGRect(origin: CGPoint(), size: targetView.bounds.size)
targetContentRect = CGRect(origin: CGPoint(), size: targetLayer.bounds.size)
}
} else if let targetViewForActivationProgress = strongSelf.targetViewForActivationProgress {
targetView = targetViewForActivationProgress
targetLayer = targetViewForActivationProgress.layer
if let targetNodeForActivationProgressContentRect = strongSelf.targetNodeForActivationProgressContentRect {
targetContentRect = targetNodeForActivationProgressContentRect
} else {
targetContentRect = CGRect(origin: CGPoint(), size: targetView.bounds.size)
targetContentRect = CGRect(origin: CGPoint(), size: targetLayer.bounds.size)
}
} else if let targetLayerForActivationProgress = strongSelf.targetLayerForActivationProgress {
targetLayer = targetLayerForActivationProgress
if let targetNodeForActivationProgressContentRect = strongSelf.targetNodeForActivationProgressContentRect {
targetContentRect = targetNodeForActivationProgressContentRect
} else {
targetContentRect = CGRect(origin: CGPoint(), size: targetLayer.bounds.size)
}
} else {
targetView = strongSelf
targetContentRect = CGRect(origin: CGPoint(), size: targetView.bounds.size)
targetLayer = strongSelf.layer
targetContentRect = CGRect(origin: CGPoint(), size: targetLayer.bounds.size)
}
let scaleSide = targetContentRect.width
let minScale: CGFloat = max(0.7, (scaleSide - 15.0) / scaleSide)
let currentScale = 1.0 * (1.0 - progress) + minScale * progress
let originalCenterOffsetX: CGFloat = targetView.bounds.width / 2.0 - targetContentRect.midX
let originalCenterOffsetX: CGFloat = targetLayer.bounds.width / 2.0 - targetContentRect.midX
let scaledCenterOffsetX: CGFloat = originalCenterOffsetX * currentScale
let originalCenterOffsetY: CGFloat = targetView.bounds.height / 2.0 - targetContentRect.midY
let originalCenterOffsetY: CGFloat = targetLayer.bounds.height / 2.0 - targetContentRect.midY
let scaledCenterOffsetY: CGFloat = originalCenterOffsetY * currentScale
let scaleMidX: CGFloat = scaledCenterOffsetX - originalCenterOffsetX
@@ -334,22 +343,38 @@ open class ContextControllerSourceView: UIView {
switch update {
case .update:
let sublayerTransform = CATransform3DTranslate(CATransform3DScale(CATransform3DIdentity, currentScale, currentScale, 1.0), scaleMidX, scaleMidY, 0.0)
targetView.layer.sublayerTransform = sublayerTransform
if strongSelf.useSublayerTransformForActivation {
targetLayer.sublayerTransform = sublayerTransform
} else {
targetLayer.transform = sublayerTransform
}
if let additionalActivationProgressLayer = strongSelf.additionalActivationProgressLayer {
additionalActivationProgressLayer.transform = sublayerTransform
}
case .begin:
let sublayerTransform = CATransform3DTranslate(CATransform3DScale(CATransform3DIdentity, currentScale, currentScale, 1.0), scaleMidX, scaleMidY, 0.0)
targetView.layer.sublayerTransform = sublayerTransform
if strongSelf.useSublayerTransformForActivation {
targetLayer.sublayerTransform = sublayerTransform
} else {
targetLayer.transform = sublayerTransform
}
if let additionalActivationProgressLayer = strongSelf.additionalActivationProgressLayer {
additionalActivationProgressLayer.transform = sublayerTransform
}
case .ended:
let sublayerTransform = CATransform3DTranslate(CATransform3DScale(CATransform3DIdentity, currentScale, currentScale, 1.0), scaleMidX, scaleMidY, 0.0)
let previousTransform = targetView.layer.sublayerTransform
targetView.layer.sublayerTransform = sublayerTransform
targetView.layer.animate(from: NSValue(caTransform3D: previousTransform), to: NSValue(caTransform3D: sublayerTransform), keyPath: "sublayerTransform", timingFunction: CAMediaTimingFunctionName.easeOut.rawValue, duration: 0.2)
if strongSelf.useSublayerTransformForActivation {
let previousTransform = targetLayer.sublayerTransform
targetLayer.sublayerTransform = sublayerTransform
targetLayer.animate(from: NSValue(caTransform3D: previousTransform), to: NSValue(caTransform3D: sublayerTransform), keyPath: "sublayerTransform", timingFunction: CAMediaTimingFunctionName.easeOut.rawValue, duration: 0.2)
} else {
let previousTransform = targetLayer.transform
targetLayer.transform = sublayerTransform
targetLayer.animate(from: NSValue(caTransform3D: previousTransform), to: NSValue(caTransform3D: sublayerTransform), keyPath: "transform", timingFunction: CAMediaTimingFunctionName.easeOut.rawValue, duration: 0.2)
}
if let additionalActivationProgressLayer = strongSelf.additionalActivationProgressLayer {
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.2, execute: {