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