Skip to content

[iOS] Missing Refreshing handler behaves inconsistently when LargePageTitles are enabled #33169

@paulober

Description

@paulober

Description

This PR documents and reproduces an iOS-specific inconsistency with RefreshView hosting a CollectionView when iOS Large Page Titles are enabled.

When the RefreshView has no Refreshing event handler set which resets IsRefreshing:

  • With ios:Page.LargeTitleDisplay="Never": the pull-to-refresh loading indicator can remain visible indefinitely.
  • With ios:Page.LargeTitleDisplay="Always": the indicator shows graphical glitches, then disappears, but the vertical space reserved for the indicator remains (layout stays “pushed down”).

All behaviors are captured using the artifact from #32081.

NotLargeTitle_ResetIsRefreshing.mov
NotLargeTitle_NotResetIsRefreshing.mov
LargeTitle_ResetIsRefreshing.mov
LargeTitle_NotResetIsRefreshing.mov

Steps to Reproduce

  1. Create a page with a RefreshView containing a CollectionView.

  2. Toggle the page large title mode using:

    • ios:Page.LargeTitleDisplay="Never" or
    • ios:Page.LargeTitleDisplay="Always"
  3. Run two variants:

    • Variant A (with handler):

      <RefreshView ... Refreshing="RefreshView_OnRefreshing">
    • Variant B (no handler):

      <RefreshView ...>
  4. On iOS, pull down to trigger the refresh indicator.

Observed results

  • LargeTitleDisplay=Never + no handler: indicator can spin forever.
  • LargeTitleDisplay=Always + no handler: indicator glitches, then disappears, but reserved space remains.

Expected result

  • Missing Refreshing handler should not produce different visual/layout behavior depending on large title mode. If refresh cannot complete, behavior should be consistent (and ideally not leave the UI in a broken layout state).

(I used the linked reproduction repo from a different issue to create the uploaded videos)

Link to public reproduction project repository

https://github.com/paulober/maui-largetitles-bug

Version with bug

Unknown/Other

Is this a regression from previous behavior?

Not sure, did not test other versions

Last version that worked well

No response

Affected platforms

iOS

Affected platform versions

iOS 26 & 26.1 and maybe older ones that support LargeTitles

Did you find any workaround?

Use one of the following patterns to ensure the refresh completes deterministically:

  1. Always handle Refreshing and reset refresh state

    private void RefreshView_OnRefreshing(object sender, EventArgs e)
    {
        try
        {
            // Do refresh work (async if needed)
        }
        finally
        {
            ((RefreshView)sender).IsRefreshing = false;
        }
    }
  2. Bind IsRefreshing to a VM property and set it back to false when done

    <RefreshView IsRefreshing="{Binding IsRefreshing}" Command="{Binding RefreshCommand}">

    (Ensure IsRefreshing is set back to false after the command completes.)

  3. Provide Command / CommandParameter instead of relying on the event
    (Same idea: ensure the refresh completion clears the refresh state.)

I also have this problem with my production app where I use a workaround to enable LargeTitles and have a command connected to the RefreshView which resets IsRefreshing but still has these graphical glitches - though I couldn't reliably reproduce this

Metadata

Metadata

Assignees

Labels

area-refreshviewplatform/ioss/triagedIssue has been revieweds/verifiedVerified / Reproducible Issue ready for Engineering Triaget/bugSomething isn't working

Type

No type
No fields configured for issues without a type.

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions