Limit image height to screen height (#1675)
* limit image height to window height minus a hardcoded value https://github.com/Dimillian/IceCubesApp/issues/1554 * Limit image to screen height - limit available height to 80% of screen/window height - if image fits in available width and height, just display it at 1x (to avoid ugly resizing artifacts) - otherwise, shrink it proportionally to fit https://github.com/Dimillian/IceCubesApp/issues/1554
This commit is contained in:
parent
59e5eba860
commit
11388757f3
|
@ -8,6 +8,10 @@ import UIKit
|
||||||
window?.bounds.size.width ?? UIScreen.main.bounds.size.width
|
window?.bounds.size.width ?? UIScreen.main.bounds.size.width
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public var windowHeight: CGFloat {
|
||||||
|
window?.bounds.size.height ?? UIScreen.main.bounds.size.height
|
||||||
|
}
|
||||||
|
|
||||||
public func scene(_ scene: UIScene,
|
public func scene(_ scene: UIScene,
|
||||||
willConnectTo _: UISceneSession,
|
willConnectTo _: UISceneSession,
|
||||||
options _: UIScene.ConnectionOptions)
|
options _: UIScene.ConnectionOptions)
|
||||||
|
|
|
@ -68,7 +68,8 @@ public struct StatusRowMediaPreviewView: View {
|
||||||
imageMaxHeight: imageMaxHeight,
|
imageMaxHeight: imageMaxHeight,
|
||||||
sensitive: sensitive,
|
sensitive: sensitive,
|
||||||
appLayoutWidth: appLayoutWidth,
|
appLayoutWidth: appLayoutWidth,
|
||||||
availableWidth: availableWidth
|
availableWidth: availableWidth,
|
||||||
|
availableHeight: sceneDelegate.windowHeight
|
||||||
)
|
)
|
||||||
.accessibilityElement(children: .ignore)
|
.accessibilityElement(children: .ignore)
|
||||||
.accessibilityLabel(Self.accessibilityLabel(for: attachments[0]))
|
.accessibilityLabel(Self.accessibilityLabel(for: attachments[0]))
|
||||||
|
@ -200,6 +201,7 @@ private struct FeaturedImagePreView: View {
|
||||||
let sensitive: Bool
|
let sensitive: Bool
|
||||||
let appLayoutWidth: CGFloat
|
let appLayoutWidth: CGFloat
|
||||||
let availableWidth: CGFloat
|
let availableWidth: CGFloat
|
||||||
|
let availableHeight: CGFloat
|
||||||
|
|
||||||
@Environment(\.isSecondaryColumn) private var isSecondaryColumn: Bool
|
@Environment(\.isSecondaryColumn) private var isSecondaryColumn: Bool
|
||||||
@Environment(Theme.self) private var theme
|
@Environment(Theme.self) private var theme
|
||||||
|
@ -207,7 +209,7 @@ private struct FeaturedImagePreView: View {
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
let size: CGSize = size(for: attachment) ?? .init(width: imageMaxHeight, height: imageMaxHeight)
|
let size: CGSize = size(for: attachment) ?? .init(width: imageMaxHeight, height: imageMaxHeight)
|
||||||
let newSize = imageSize(from: size, newWidth: availableWidth - appLayoutWidth)
|
let newSize = imageSize(from: size)
|
||||||
Group {
|
Group {
|
||||||
switch attachment.supportedType {
|
switch attachment.supportedType {
|
||||||
case .image:
|
case .image:
|
||||||
|
@ -255,13 +257,27 @@ private struct FeaturedImagePreView: View {
|
||||||
return .init(width: CGFloat(width), height: CGFloat(height))
|
return .init(width: CGFloat(width), height: CGFloat(height))
|
||||||
}
|
}
|
||||||
|
|
||||||
private func imageSize(from: CGSize, newWidth: CGFloat) -> CGSize {
|
private func imageSize(from: CGSize) -> CGSize {
|
||||||
if isCompact || theme.statusDisplayStyle == .compact || isSecondaryColumn {
|
if isCompact || theme.statusDisplayStyle == .compact || isSecondaryColumn {
|
||||||
return .init(width: imageMaxHeight, height: imageMaxHeight)
|
return .init(width: imageMaxHeight, height: imageMaxHeight)
|
||||||
}
|
}
|
||||||
let ratio = newWidth / from.width
|
|
||||||
let newHeight = from.height * ratio
|
let boxWidth = availableWidth - appLayoutWidth
|
||||||
return .init(width: newWidth, height: newHeight)
|
let boxHeight = availableHeight * 0.8 // use only 80% of window height to leave room for text
|
||||||
|
|
||||||
|
if from.width <= boxWidth && from.height <= boxHeight {
|
||||||
|
// intrinsic size of image fits just fine
|
||||||
|
return from
|
||||||
|
}
|
||||||
|
|
||||||
|
// shrink image proportionally to fit inside the box
|
||||||
|
let xRatio = boxWidth / from.width
|
||||||
|
let yRatio = boxHeight / from.height
|
||||||
|
if xRatio < yRatio {
|
||||||
|
return .init(width: boxWidth, height: from.height * xRatio)
|
||||||
|
} else {
|
||||||
|
return .init(width: from.width * yRatio, height: boxHeight)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue