-
Notifications
You must be signed in to change notification settings - Fork 2.9k
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
[$125] IOS - Avatar doesn't get back to its original center position after zooming in and out #53471
Comments
Triggered auto assignment to @greg-schroeder ( |
Job added to Upwork: https://www.upwork.com/jobs/~021863989062279850488 |
Triggered auto assignment to Contributor-plus team member for initial proposal review - @abdulrahuman5196 ( |
Upwork job price has been updated to $125 |
Hi! I came across your job posting on Upwork regarding the avatar centering issue in your iOS app. After analyzing the problem where the avatar doesn't return to center after zoom gestures, I believe this can be fixed effectively through iterative solutions. I am a full time full stack iOS developer, designer and game developer at MagicHabits. This can be fixed in max 1-2 days. Based on my experience with iOS gesture handling and UI animations, I've identified 5 potential approaches that could solve this: Spring Animation Reset swiftCopyUIView.animate(withSpringDamping: 0.8) { Velocity-Based Repositioning swiftCopylet velocity = gesture.velocity(in: view) Smart Edge Detection swiftCopyif !safeBounds.contains(avatar.frame) { Progressive Center Force swiftCopylet centerForce = 1 - currentScale Physics-Based Boundaries swiftCopylet behavior = UIAttachmentBehavior(item: avatarImageView) I suggest implementing Solution #1 (Spring Animation Reset) first, then enhancing it with elements of Solution #4 (Progressive Center Force). This combination would: Provide immediate improvement in UX Let me know if you like it so I can submit a proposal on upwork! |
📣 @ahmedkhan28! 📣
|
Contributor details |
✅ Contributor details stored successfully. Thank you for contributing to Expensify! |
ProposalPlease re-state the problem that we are trying to solve in this issue.Avatar doesn't get back to its original center position after zooming in and out What is the root cause of that problem?The root cause is in the pinch gesture's
However, it doesn't handle the case where the image is at a normal zoom level but offset from center. Here's the relevant code showing this limitation: .onEnd(() => {
if (zoomScale.get() < zoomRange.min) {
// Handles underzooming but not general positioning
pinchScale.set(zoomRange.min);
zoomScale.set(withSpring(zoomRange.min, SPRING_CONFIG));
} else if (zoomScale.get() > zoomRange.max) {
// Handles overzooming but not general positioning
pinchScale.set(zoomRange.max);
zoomScale.set(withSpring(zoomRange.max, SPRING_CONFIG));
} else {
// No position correction happens here
pinchScale.set(zoomScale.get());
}
}); What changes do you think we should make in order to solve the problem?We should modify the The logic should be added in the .onEnd(() => {
// ... existing code ...
if (zoomScale.get() < zoomRange.min) {
// If the zoom scale is less than the minimum zoom scale, we need to set the zoom scale to the minimum
pinchScale.set(zoomRange.min);
zoomScale.set(withSpring(zoomRange.min, SPRING_CONFIG, triggerScaleChangedEvent));
} else if (zoomScale.get() > zoomRange.max) {
// If the zoom scale is higher than the maximum zoom scale, we need to set the zoom scale to the maximum
pinchScale.set(zoomRange.max);
zoomScale.set(withSpring(zoomRange.max, SPRING_CONFIG, triggerScaleChangedEvent));
} else {
+ // Ensure image is centered
+ offsetX.set(withSpring(0, SPRING_CONFIG));
+ offsetY.set(withSpring(0, SPRING_CONFIG));
// Otherwise, we just update the pinch scale offset
pinchScale.set(zoomScale.get());
triggerScaleChangedEvent();
}
}); What specific scenarios should we cover in automated tests to prevent reintroducing this issue in the future?N/A What alternative solutions did you explore? (Optional)N/A ResultScreen.Recording.2024-12-09.at.8.43.08.PM.mov |
📣 @JoshIri360! 📣
|
Contributor details |
✅ Contributor details stored successfully. Thank you for contributing to Expensify! |
Submitted the proposal just now, thank you! |
Next up is proposal review |
@greg-schroeder, @abdulrahuman5196 Huh... This is 4 days overdue. Who can take care of this? |
We had to have a contract before me solving it, right?
…On Mon, 9 Dec 2024 at 2:42 PM, melvin-bot[bot] ***@***.***> wrote:
@greg-schroeder <https://github.com/greg-schroeder>, @abdulrahuman5196
<https://github.com/abdulrahuman5196> Huh... This is 4 days overdue. Who
can take care of this?
—
Reply to this email directly, view it on GitHub
<#53471 (comment)>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/BACMSUPE6HB5SRTCJIZO6OL2EVQXXAVCNFSM6AAAAABS54WRMOVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDKMRXGQYTKMZZG4>
.
You are receiving this because you were mentioned.Message ID:
***@***.***>
|
Hi, will review today |
Thanks @abdulrahuman5196 |
@ahmedkhan28 / @JoshIri360 Kindly follow the proposal template for suggesting solutions as mentioned here https://github.com/Expensify/App/blob/main/contributingGuides/CONTRIBUTING.md#propose-a-solution-for-the-job And on another not @JoshIri360 I tried your solution and its not fixing the issue. I am still able to repro the issue with your solution. |
No pending proposal to review or approve yet |
Proposal |
📣 It's been a week! Do we have any satisfactory proposals yet? Do we need to adjust the bounty for this issue? 💸 |
@greg-schroeder, @abdulrahuman5196 Uh oh! This issue is overdue by 2 days. Don't forget to update your issues! |
The only change is that the code changed from the if check to else check. Why do think the new change would work? Not sure on how the new change in the proposal is expected to work. |
Currently, recentering only happens in extreme cases: .onEnd(() => {
// Extreme case 1: Zoomed too far out
if (zoomScale.get() < zoomRange.min) {
pinchScale.set(zoomRange.min);
zoomScale.set(withSpring(zoomRange.min, SPRING_CONFIG));
// Image recenters here
}
// Extreme case 2: Zoomed too far in
else if (zoomScale.get() > zoomRange.max) {
pinchScale.set(zoomRange.max);
zoomScale.set(withSpring(zoomRange.max, SPRING_CONFIG));
// Image recenters here
}
// Normal case: No recentering happens
else {
pinchScale.set(zoomScale.get());
}
}); The proposed change ensures recentering happens in all cases: .onEnd(() => {
// Extreme case 1: Zoomed too far out
if (zoomScale.get() < zoomRange.min) {
pinchScale.set(zoomRange.min);
zoomScale.set(withSpring(zoomRange.min, SPRING_CONFIG));
}
// Extreme case 2: Zoomed too far in
else if (zoomScale.get() > zoomRange.max) {
pinchScale.set(zoomRange.max);
zoomScale.set(withSpring(zoomRange.max, SPRING_CONFIG));
}
// Normal case: Now we also recenter here
else {
// Always recenter after any pinch gesture
offsetX.set(withSpring(0, SPRING_CONFIG));
offsetY.set(withSpring(0, SPRING_CONFIG));
pinchScale.set(zoomScale.get());
}
}); As shown in the video, this creates a more consistent experience because the avatar always returns to center after the user finishes their pinch gesture, regardless of whether they were doing an extreme zoom or just a normal interaction. I'll update the proposal to include these explanations to better illustrate the technical difference. |
Proposal |
If you haven’t already, check out our contributing guidelines for onboarding and email contributors@expensify.com to request to join our Slack channel!
Version Number: 9.0.70-2
Reproducible in staging?: Y
Reproducible in production?: Y
If this was caught on HybridApp, is this reproducible on New Expensify Standalone?: Y
If this was caught during regression testing, add the test name, ID and link from TestRail: https://expensify.testrail.io/index.php?/tests/view/5291133
Email or phone of affected tester (no customers): nathanmulugetatesting+2272@gmail.com
Issue reported by: Applause - Internal Team
Action Performed:
Expected Result:
The position of the avatar gets back to its original center position
Actual Result:
The avatar stays at the position it was released on and doesn't get back to the center
Workaround:
Unknown
Platforms:
Which of our officially supported platforms is this issue occurring on?
Screenshots/Videos
Add any screenshot/video evidence
Bug6683084_1733231204767.ScreenRecording_12-03-2024_15-58-36_1.1.mp4
View all open jobs on GitHub
Upwork Automation - Do Not Edit
Issue Owner
Current Issue Owner: @abdulrahuman5196The text was updated successfully, but these errors were encountered: