diff --git a/submodules/Display/Source/ContainerViewLayout.swift b/submodules/Display/Source/ContainerViewLayout.swift index f67059afc6..bfd209491b 100644 --- a/submodules/Display/Source/ContainerViewLayout.swift +++ b/submodules/Display/Source/ContainerViewLayout.swift @@ -140,36 +140,55 @@ public extension ContainerViewLayout { return false } + var deviceOrientationSize: CGSize { + let screenSize = self.deviceMetrics.screenSize + return self.actualOrientation == .landscape ? CGSize(width: screenSize.height, height: screenSize.width) : screenSize + } + var inSplitView: Bool { - var maybeSplitView = false - if case .tablet = self.deviceMetrics.type { - if case .compact = self.metrics.widthClass { - maybeSplitView = true - } - if case .compact = self.metrics.heightClass { - maybeSplitView = true - } + guard case .tablet = self.deviceMetrics.type else { + return false } - if maybeSplitView && abs(max(self.size.width, self.size.height) - self.deviceMetrics.screenSize.height) < 1.0 { + guard self.metrics.widthClass == .compact || self.metrics.heightClass == .compact else { + return false + } + + let orient = self.deviceOrientationSize + guard abs(self.size.height - orient.height) < 1.0 else { + return false + } + + let ratio = self.size.width / max(orient.width, 1.0) + let tol: CGFloat = 0.04 + let isSplitFraction = abs(ratio - 0.5) < tol || abs(ratio - (1.0/3.0)) < tol || abs(ratio - (2.0/3.0)) < tol + + return isSplitFraction + } + + var inSlideOver: Bool { + guard case .tablet = self.deviceMetrics.type else { + return false + } + guard self.metrics.widthClass == .compact || self.metrics.heightClass == .compact else { + return false + } + let currentLong = max(self.size.width, self.size.height) + let screenLong = max(self.deviceMetrics.screenSize.width, self.deviceMetrics.screenSize.height) + + if abs(currentLong - screenLong) > 10.0 { return true } return false } - var inSlideOver: Bool { - var maybeSlideOver = false - if case .tablet = self.deviceMetrics.type { - if case .compact = self.metrics.widthClass { - maybeSlideOver = true - } - if case .compact = self.metrics.heightClass { - maybeSlideOver = true - } - } - if maybeSlideOver && abs(max(self.size.width, self.size.height) - self.deviceMetrics.screenSize.height) > 10.0 { - return true - } - return false + var actualOrientation: LayoutOrientation { + let screenPortraitHeight = max(self.deviceMetrics.screenSize.width, self.deviceMetrics.screenSize.height) + let screenPortraitWidth = min(self.deviceMetrics.screenSize.width, self.deviceMetrics.screenSize.height) + + let deltaPortrait = abs(self.size.height - screenPortraitHeight) + let deltaLandscape = abs(self.size.height - screenPortraitWidth) + + return deltaLandscape < deltaPortrait ? .landscape : .portrait } var orientation: LayoutOrientation { diff --git a/submodules/TelegramUI/Sources/ChatControllerNode.swift b/submodules/TelegramUI/Sources/ChatControllerNode.swift index 4666344780..7cd2e4e94a 100644 --- a/submodules/TelegramUI/Sources/ChatControllerNode.swift +++ b/submodules/TelegramUI/Sources/ChatControllerNode.swift @@ -1929,10 +1929,15 @@ class ChatControllerNode: ASDisplayNode, ASScrollViewDelegate { if case .regular = layout.metrics.widthClass, layout.size.height == layout.deviceMetrics.screenSize.width { displayMode = .aspectFit } else if case .compact = layout.metrics.widthClass { - if layout.size.width < layout.size.height && layout.size.height < layout.deviceMetrics.screenSize.height { - wallpaperBounds.size = layout.deviceMetrics.screenSize - } else if layout.size.width > layout.size.height && layout.size.height < layout.deviceMetrics.screenSize.width { - wallpaperBounds.size = layout.deviceMetrics.screenSize + if layout.inSplitView { + displayMode = .aspectFit + } else if layout.inSlideOver { + switch layout.actualOrientation { + case .portrait: + wallpaperBounds.size = CGSize(width: layout.size.width, height: layout.deviceMetrics.screenSize.height) + case .landscape: + wallpaperBounds.size = CGSize(width: layout.size.width, height: layout.deviceMetrics.screenSize.width) + } } } self.backgroundNode.updateLayout(size: wallpaperBounds.size, displayMode: displayMode, transition: transition) diff --git a/submodules/WallpaperBackgroundNode/Sources/WallpaperBackgroundNode.swift b/submodules/WallpaperBackgroundNode/Sources/WallpaperBackgroundNode.swift index 4bfe3ee995..e605ee443a 100644 --- a/submodules/WallpaperBackgroundNode/Sources/WallpaperBackgroundNode.swift +++ b/submodules/WallpaperBackgroundNode/Sources/WallpaperBackgroundNode.swift @@ -1401,16 +1401,24 @@ public final class WallpaperBackgroundNodeImpl: ASDisplayNode, WallpaperBackgrou let targetSize: CGSize = self.bounds.size let containerSize: CGSize = rect.containerSize - let useAspectFit: Bool = false - let renderScale: CGFloat = useAspectFit + let isAspectFit: Bool = (displayMode == .aspectFit || displayMode == .halfAspectFill) + + let renderScale: CGFloat = isAspectFit ? min(targetSize.width / containerSize.width, targetSize.height / containerSize.height) : max(targetSize.width / containerSize.width, targetSize.height / containerSize.height) let drawingSize = CGSize(width: containerSize.width * renderScale, height: containerSize.height * renderScale) - let offsetX = (targetSize.width - drawingSize.width) * 0.5 - let offsetY = (targetSize.height - drawingSize.height) * 0.5 + let offsetX: CGFloat + let offsetY: CGFloat + if isAspectFit { + offsetX = 0.0 + offsetY = (targetSize.height - drawingSize.height) * 0.5 + } else { + offsetX = (targetSize.width - drawingSize.width) * 0.5 + offsetY = (targetSize.height - drawingSize.height) * 0.5 + } let onScreenCenter = CGPoint(x: offsetX + rect.center.x * renderScale, y: offsetY + rect.center.y * renderScale)