mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-23 06:35:51 +00:00
Input node improvements
This commit is contained in:
@@ -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: {
|
||||
|
||||
Reference in New Issue
Block a user