-
Notifications
You must be signed in to change notification settings - Fork 3k
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! |
Edited by proposal-police: This proposal was edited at 2024-12-20 10:33:27 UTC. 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 of this problem is that recentering the avatar is only done if the zoom scale is less than the minimum zoom scale or more than the maximum zoom scale. When zoomed past the minimum zoom, it recenters and adjusts the zoom: overzoomed.mp4When zoomed past the maximum zoom, it does the same (may be difficult to see here) output.mp4If it's not a maximum or minimum zoom, there is no recenter, this allows the user move the avatar in any direction without it recentering Recording.at.2024-12-20.11.06.43.mp4The line of code that helps the zoom recenter after minimum or maximum zoom can be found here: App/src/components/MultiGestureCanvas/usePinchGesture.ts Lines 164 to 168 in 207622d
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 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, It's a UI issue What alternative solutions did you explore? (Optional)N/A Resultcompressednormalxoom.mp4 |
📣 @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 |
I am not sure this is correct RCA. I am even reproducing this issue in zoomed out state.
I don't think we should blindly recentering without knowing what is the exact root cause. I would need to know a strong RCA since the issue is happening at rare cases and its easy to mistake any change we make as a potential fix. Kindly provide information on RCA with some proof information. |
@greg-schroeder @abdulrahuman5196 this issue was created 2 weeks ago. Are we close to approving a proposal? If not, what's blocking us from getting this issue assigned? Don't hesitate to create a thread in #expensify-open-source to align faster in real time. Thanks! |
Proposals still coming through |
📣 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! |
Proposal |
If you haven’t already, check out our contributing guidelines for onboarding and email [email protected] 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): [email protected]
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: