TM-SGNL-iOS/SignalUI/UIKitExtensions/UIGeometry+Signal.swift
TeleMessage developers dde0620daf initial commit
2025-05-03 12:28:28 -07:00

55 lines
2 KiB
Swift

//
// Copyright 2022 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
import SignalServiceKit
public extension UIEdgeInsets {
func inverted() -> UIEdgeInsets {
return UIEdgeInsets(top: -top, left: -left, bottom: -bottom, right: -right)
}
}
public extension CGSize {
func roundedForScreenScale() -> CGSize {
let screenScale = UIScreen.main.scale
guard screenScale > 1 else { return self }
return CGSize(
width: (width * screenScale).rounded(.up) / screenScale,
height: (height * screenScale).rounded(.up) / screenScale
)
}
}
public extension CGFloat {
static let hairlineWidth: CGFloat = 1 / UIScreen.main.scale
static func hairlineWidthFraction(_ fraction: CGFloat) -> CGFloat {
fraction * .hairlineWidth
}
private static let iPhone5ScreenWidth: CGFloat = 320
private static let iPhone7PlusScreenWidth: CGFloat = 414
// A convenience method for doing responsive layout. Scales between two
// reference values (for iPhone 5 and iPhone 7 Plus) to the current device
// based on screen width, linearly interpolating.
static func scaleFromIPhone5To7Plus(_ iPhone5Value: CGFloat, _ iPhone7PlusValue: CGFloat) -> CGFloat {
let shortDimension = CurrentAppContext().frame.size.smallerAxis
let alpha = CGFloat.clamp01(CGFloat.inverseLerp(shortDimension, min: iPhone5ScreenWidth, max: iPhone7PlusScreenWidth))
return CGFloat.lerp(left: iPhone5Value, right: iPhone7PlusValue, alpha: alpha).rounded()
}
// A convenience method for doing responsive layout. Scales a reference
// value (for iPhone 5) to the current device based on screen width,
// linearly interpolating through the origin.
static func scaleFromIPhone5(_ iPhone5Value: CGFloat) -> CGFloat {
let shortDimension = CurrentAppContext().frame.size.smallerAxis
return (iPhone5Value * shortDimension / iPhone5ScreenWidth).rounded()
}
}