Skip to content
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

Fix iOS Card Text Overlap Issue by Making Font Size Dynamic #255

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

Laihu08
Copy link

@Laihu08 Laihu08 commented Mar 4, 2025

🔹 Pull Request Description:

Issue Reference:

This PR addresses [Issue #242](#242) where the year text overlaps with the "days left" indicator on iPhones, particularly when system font sizes are increased.


🔹 Problem Overview

  • The PlanCard widget displays a large, fixed-size year text (fontSize: 80), which does not scale dynamically.
  • When the user increases system font size (via iOS Accessibility settings), the year text overflows and collides with the "days left" text, causing a layout issue.

🔹 Solution Implemented

  1. ✅ Made Font Size Responsive

    • Replaced hardcoded fontSize: 80 with MediaQuery scaling:
      fontSize: MediaQuery.of(context).size.width * 0.1
    • This makes the text scale dynamically based on screen width, preventing overflow.
  2. ✅ Enabled Dynamic Type Support (Accessibility)

    • Updated text styling to respect system font settings:
      style: Theme.of(context).textTheme.displayLarge?.copyWith(
           fontSize: MediaQuery.of(context).size.width * 0.1,
           color: Theme.of(context).colorScheme.primary,
         )
    • This ensures that the app supports Dynamic Type (allowing users to increase font size without breaking the layout).
  3. ✅ Ensured UI Responsiveness

    • The year text now resizes dynamically, preventing overlap with the "days left" progress indicator.
    • It adjusts smoothly when users switch between devices, screen sizes, or font settings.

🔹 Testing & Verification

  • Tested on iPhone 16 Pro & other iOS devices to confirm no overlap.
  • Adjusted font size in iOS settings (Settings → Accessibility → Display & Text Size → Larger Text).
  • Ensured smooth UI layout across various screen sizes.

🔹 Why This Solution?

  • 🔹 Removes the need for manual font size adjustments—everything scales dynamically.
  • 🔹 Improves accessibility & usability—users can increase font size without breaking the UI.
  • 🔹 Ensures a consistent UI experience across different iPhone screen sizes & resolutions.
  • 🔹 Future-Proofing—avoids UI breakage in future iOS updates & devices.

🚀 Next Steps

  • Review the PR & provide feedback.
  • Merge once approved.
  • Deploy & test in a broader user environment.

🎯 Final Notes

🚀 This fix ensures that the card text layout remains stable, readable, and accessible across all iOS devices! 🚀
🔥 Ready for review & merge! 🔥

@wfleischer
Copy link
Collaborator

Hi @Laihu08,

First off, a huge thank you for your contribution to NWT Reading! We truly appreciate you taking the time to help improve the project. Your effort is very valuable!

I've recently added contribution guidelines to the repository, which you might find helpful for future contributions. They cover a range of topics, including how to ensure cross-platform compatibility.

Regarding the changes in the ios directory, I noticed that the patch seems to specifically address the issue on iOS. NWT Reading is designed to support multiple platforms, including Android, iOS, Linux, macOS, Web, and Windows, so we aim for solutions that work across all of them.

To explore a cross-platform approach, I did a little experiment with the FittedBox widget. Here's the change I made to plan_card.dart:

diff --git a/lib/src/plans/presentations/plan_card.dart b/lib/src/plans/presentations/plan_card.dart
index bc3d83b..618cf9f 100644
--- a/lib/src/plans/presentations/plan_card.dart
+++ b/lib/src/plans/presentations/plan_card.dart
@@ -50,12 +50,16 @@ class PlanCard extends ConsumerWidget {
           )
         ]);

-    buildYearText() => Text(
-          plan.lastDate == null
-              ? ''
-              : MaterialLocalizations.of(context).formatYear(plan.lastDate!),
-          style: TextStyle(
-              fontSize: 80, color: Theme.of(context).colorScheme.primary),
+    buildYearText() => FittedBox(
+          fit: BoxFit.scaleDown,
+          alignment: Alignment.topLeft,
+          child: Text(
+            plan.lastDate == null
+                ? ''
+                : MaterialLocalizations.of(context).formatYear(plan.lastDate!),
+            style: TextStyle(
+                fontSize: 80, color: Theme.of(context).colorScheme.primary),
+          ),
         );

     buildRemainingDaysStatus() => isFinished
@@ -80,7 +84,7 @@ class PlanCard extends ConsumerWidget {
         children: [
           Positioned(left: 10, top: 10, child: buildNameTitle()),
           Positioned(right: 15, bottom: 15, child: buildRemainingDaysStatus()),
-          Positioned(left: 20, bottom: 0, child: buildYearText()),
+          Positioned(left: 20, right: 80, bottom: 0, child: buildYearText()),
         ],
       ),
     );

Here are the visual results of this experiment:

Initial View:
Screenshot little space
Shrunken Space:
Screenshot shrunken
Further Shrunken Space:
Screenshot tiny space

It seems like the FittedBox helps, but we might also need to apply it to the remaining days progress status to ensure it scales correctly in very tight spaces.

I haven't had a chance to fully explore this approach yet, but I wanted to share it with you. Do you think using FittedBox might be a viable solution that works across all platforms?

I'm very open to your thoughts and suggestions. Thanks again for your contribution, and I look forward to hearing your perspective.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants