iPad wallpaper improvements

This commit is contained in:
Ilya Laktyushin
2025-09-06 14:59:50 +05:00
parent 76e8d79f9f
commit 33fe6eb476
3 changed files with 63 additions and 31 deletions

View File

@@ -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 {

View File

@@ -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)

View File

@@ -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)