mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-07-17 00:31:09 +00:00
Improve standalone modal presentation
This commit is contained in:
parent
4dcedbd52a
commit
3cf7c9931d
@ -532,6 +532,7 @@ open class NavigationController: UINavigationController, ContainableController,
|
|||||||
|
|
||||||
var previousModalContainer: NavigationModalContainer?
|
var previousModalContainer: NavigationModalContainer?
|
||||||
var visibleModalCount = 0
|
var visibleModalCount = 0
|
||||||
|
var hasVisibleStandaloneModal = false
|
||||||
var topModalDismissProgress: CGFloat = 0.0
|
var topModalDismissProgress: CGFloat = 0.0
|
||||||
|
|
||||||
for i in (0 ..< navigationLayout.modal.count).reversed() {
|
for i in (0 ..< navigationLayout.modal.count).reversed() {
|
||||||
@ -577,9 +578,13 @@ open class NavigationController: UINavigationController, ContainableController,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if modalContainer.supernode != nil {
|
if modalContainer.supernode != nil {
|
||||||
if !isStandaloneModal || visibleModalCount != 0 {
|
if !hasVisibleStandaloneModal && !isStandaloneModal {
|
||||||
visibleModalCount += 1
|
visibleModalCount += 1
|
||||||
}
|
}
|
||||||
|
if isStandaloneModal {
|
||||||
|
hasVisibleStandaloneModal = true
|
||||||
|
visibleModalCount = 0
|
||||||
|
}
|
||||||
if previousModalContainer == nil {
|
if previousModalContainer == nil {
|
||||||
topModalDismissProgress = modalContainer.dismissProgress
|
topModalDismissProgress = modalContainer.dismissProgress
|
||||||
if case .compact = layout.metrics.widthClass {
|
if case .compact = layout.metrics.widthClass {
|
||||||
|
@ -334,20 +334,25 @@ final class NavigationModalContainer: ASDisplayNode, UIScrollViewDelegate, UIGes
|
|||||||
var topInset: CGFloat
|
var topInset: CGFloat
|
||||||
if isStandaloneModal {
|
if isStandaloneModal {
|
||||||
topInset = 0.0
|
topInset = 0.0
|
||||||
|
containerLayout = layout
|
||||||
|
|
||||||
|
let unscaledFrame = CGRect(origin: CGPoint(x: 0.0, y: 0.0), size: containerLayout.size)
|
||||||
|
containerScale = 1.0
|
||||||
|
containerFrame = unscaledFrame
|
||||||
} else {
|
} else {
|
||||||
topInset = 10.0
|
topInset = 10.0
|
||||||
if let statusBarHeight = layout.statusBarHeight {
|
if let statusBarHeight = layout.statusBarHeight {
|
||||||
topInset += statusBarHeight
|
topInset += statusBarHeight
|
||||||
}
|
}
|
||||||
|
|
||||||
|
containerLayout = ContainerViewLayout(size: CGSize(width: layout.size.width, height: layout.size.height - topInset), metrics: layout.metrics, deviceMetrics: layout.deviceMetrics, intrinsicInsets: UIEdgeInsets(top: 0.0, left: layout.intrinsicInsets.left, bottom: layout.intrinsicInsets.bottom, right: layout.intrinsicInsets.right), safeInsets: UIEdgeInsets(top: 0.0, left: layout.safeInsets.left, bottom: layout.safeInsets.bottom, right: layout.safeInsets.right), statusBarHeight: nil, inputHeight: layout.inputHeight, inputHeightIsInteractivellyChanging: layout.inputHeightIsInteractivellyChanging, inVoiceOver: layout.inVoiceOver)
|
||||||
|
let unscaledFrame = CGRect(origin: CGPoint(x: 0.0, y: topInset - coveredByModalTransition * 10.0), size: containerLayout.size)
|
||||||
|
let maxScale: CGFloat = (containerLayout.size.width - 16.0 * 2.0) / containerLayout.size.width
|
||||||
|
containerScale = 1.0 * (1.0 - coveredByModalTransition) + maxScale * coveredByModalTransition
|
||||||
|
let maxScaledTopInset: CGFloat = topInset - 10.0
|
||||||
|
let scaledTopInset: CGFloat = topInset * (1.0 - coveredByModalTransition) + maxScaledTopInset * coveredByModalTransition
|
||||||
|
containerFrame = unscaledFrame.offsetBy(dx: 0.0, dy: scaledTopInset - (unscaledFrame.midY - containerScale * unscaledFrame.height / 2.0))
|
||||||
}
|
}
|
||||||
|
|
||||||
containerLayout = ContainerViewLayout(size: CGSize(width: layout.size.width, height: layout.size.height - topInset), metrics: layout.metrics, deviceMetrics: layout.deviceMetrics, intrinsicInsets: UIEdgeInsets(top: 0.0, left: layout.intrinsicInsets.left, bottom: layout.intrinsicInsets.bottom, right: layout.intrinsicInsets.right), safeInsets: UIEdgeInsets(top: 0.0, left: layout.safeInsets.left, bottom: layout.safeInsets.bottom, right: layout.safeInsets.right), statusBarHeight: nil, inputHeight: layout.inputHeight, inputHeightIsInteractivellyChanging: layout.inputHeightIsInteractivellyChanging, inVoiceOver: layout.inVoiceOver)
|
|
||||||
let unscaledFrame = CGRect(origin: CGPoint(x: 0.0, y: topInset - coveredByModalTransition * 10.0), size: containerLayout.size)
|
|
||||||
let maxScale: CGFloat = (containerLayout.size.width - 16.0 * 2.0) / containerLayout.size.width
|
|
||||||
containerScale = 1.0 * (1.0 - coveredByModalTransition) + maxScale * coveredByModalTransition
|
|
||||||
let maxScaledTopInset: CGFloat = topInset - 10.0
|
|
||||||
let scaledTopInset: CGFloat = topInset * (1.0 - coveredByModalTransition) + maxScaledTopInset * coveredByModalTransition
|
|
||||||
containerFrame = unscaledFrame.offsetBy(dx: 0.0, dy: scaledTopInset - (unscaledFrame.midY - containerScale * unscaledFrame.height / 2.0))
|
|
||||||
case .regular:
|
case .regular:
|
||||||
self.panRecognizer?.isEnabled = false
|
self.panRecognizer?.isEnabled = false
|
||||||
self.dim.backgroundColor = UIColor(white: 0.0, alpha: 0.4)
|
self.dim.backgroundColor = UIColor(white: 0.0, alpha: 0.4)
|
||||||
|
@ -4488,6 +4488,17 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
print()
|
print()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch self.presentationInterfaceState.mode {
|
||||||
|
case .standard, .inline:
|
||||||
|
break
|
||||||
|
case .overlay:
|
||||||
|
if layout.safeInsets.top.isZero {
|
||||||
|
self.statusBar.statusBarStyle = .Hide
|
||||||
|
} else {
|
||||||
|
self.statusBar.statusBarStyle = .Ignore
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
self.chatDisplayNode.containerLayoutUpdated(layout, navigationBarHeight: self.navigationHeight, transition: transition, listViewTransaction: { updateSizeAndInsets, additionalScrollDistance, scrollToTop, completion in
|
self.chatDisplayNode.containerLayoutUpdated(layout, navigationBarHeight: self.navigationHeight, transition: transition, listViewTransaction: { updateSizeAndInsets, additionalScrollDistance, scrollToTop, completion in
|
||||||
self.chatDisplayNode.historyNode.updateLayout(transition: transition, updateSizeAndInsets: updateSizeAndInsets, additionalScrollDistance: additionalScrollDistance, scrollToTop: scrollToTop, completion: completion)
|
self.chatDisplayNode.historyNode.updateLayout(transition: transition, updateSizeAndInsets: updateSizeAndInsets, additionalScrollDistance: additionalScrollDistance, scrollToTop: scrollToTop, completion: completion)
|
||||||
})
|
})
|
||||||
@ -4823,7 +4834,6 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
self.statusBar.statusBarStyle = self.presentationData.theme.rootController.statusBarStyle.style
|
self.statusBar.statusBarStyle = self.presentationData.theme.rootController.statusBarStyle.style
|
||||||
self.deferScreenEdgeGestures = []
|
self.deferScreenEdgeGestures = []
|
||||||
case .overlay:
|
case .overlay:
|
||||||
self.statusBar.statusBarStyle = .Hide
|
|
||||||
self.deferScreenEdgeGestures = [.top]
|
self.deferScreenEdgeGestures = [.top]
|
||||||
case .inline:
|
case .inline:
|
||||||
self.statusBar.statusBarStyle = .Ignore
|
self.statusBar.statusBarStyle = .Ignore
|
||||||
|
Loading…
x
Reference in New Issue
Block a user