-
Notifications
You must be signed in to change notification settings - Fork 1.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add ImageSize #23929
Add ImageSize #23929
Conversation
Generated by 🚫 Danger |
📲 You can test the changes from this Pull Request in WordPress Alpha by scanning the QR code below to install the corresponding build.
|
📲 You can test the changes from this Pull Request in Jetpack Alpha by scanning the QR code below to install the corresponding build.
|
/// Image size in **pixels**. | ||
public struct ImageSize: Hashable, Sendable { | ||
public let width: CGFloat | ||
public let height: CGFloat |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should these properties be Int? There is no decimal pixel, right?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Updated in the upcoming PR.
self.height = height | ||
} | ||
|
||
public init(_ size: CGSize) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What do you thinking changing this API to init(pixels:)
? IMHO, the name init(pixels:)
matches the init(scaling...)
ones to make it a bit clearer that this API accepts pixels sizes, and the "scaling" ones accept points sizes.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That makes sense; updating in the upcoming PR.
/// Initializes `ImageSize` with the given size scaled for the current trait | ||
/// collection display scale. | ||
public init(scaling size: CGSize) { | ||
self.init(size.scaled(by: UITraitCollection.current.displayScale)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Using UITraitCollection.current.displayScale
as the default scale (even though that may be the correct value 90% of the time) may lead to misuse. What do you think about adding a non-optional scale
argument here? Maybe, even include "points" in the name: ImageSize(points:scale:)
?
Of course, you can add some convenient methods on top of it, like ImageSize(points: CGSize, in: UITraitCollection)
, to make it easier to use the app wide scale easier: ImageSize(points: ..., in: .current)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, you can misuse current
. I'm not entirely sure I understand how it works. I'm chasing it to the following:
/// A convenience initializer that creates `ImageSize` with the given size
/// in **points** scaled for the given view.
@MainActor
public init(scaling size: CGSize, in view: UIView) {
self.init(scaling: size, scale: view.traitCollection.displayScale)
}
/// Initializes `ImageSize` with the given size in **points** scaled for the
/// current trait collection display scale.
public init(scaling size: CGSize, scale: CGFloat) {
self.init(pixels: size.scaled(by: max(1, scale)))
}
- It doesn't use
current
anymore - It enforces you to either provide a
view
(always has a valid trait collection) or ascale
exclicitly - Add
max(1, scale)
just in case - Add documentation (
**points**
)
Adds
ImageSize
to clarify thatImageDownloader
uses pixels as a parameter and make sure you can't blindly pass something likeview.frame.size
to in, which is incorrect.This PR also adds
ImageRequest
support toAsyncImageView
.Regression Notes
Potential unintended areas of impact
What I did to test those areas of impact (or what existing automated tests I relied on)
What automated tests I added (or what prevented me from doing so)
PR submission checklist:
RELEASE-NOTES.txt
if necessary.Testing checklist: