SwiftUIMaterialTabs icon indicating copy to clipboard operation
SwiftUIMaterialTabs copied to clipboard

Could you please guide me on how to add support for Pull to Refresh?

Open vchaubey-ontic opened this issue 4 months ago • 1 comments

In my project, I need to implement a Pull-to-Refresh feature that updates the UI whenever the user performs a pull-down gesture. here is my code:

MaterialTabs(
    selectedTab: $selectedTab,
    
    //Header
    headerTitle: { context in
        EntityBaseHeaderView(
            bottomViewPopupData: $bottomViewPopupData,
            selectedField: $selectedField,
            fileSelectedField: $fileSelectedField,
            actionData: $actionData
        )
        .environmentObject(entityDetailVM)
        .headerStyle(OffsetHeaderStyle(fade: true), context: context)
    },
    
    //TabBarView
    headerTabBar: { _ in
        ScrollableTabBarView(
            selection: $selectedTab,
            items: entityDetailVM.navigationTabs.map {
                ScrollableTabBarItem(id: $0.tabType, label: $0.label, count: $0.count)
            }
        )
    },
    
    //Background
    headerBackground: { context in
        Color(UIColor.systemBackground)
    },
    
    //Pages
    content: {
        ForEach(entityDetailVM.navigationTabs) { item in
            MaterialTabsScroll(tab: item.tabType) { _ in
                LazyVStack(spacing: 0) {
                    EntityTabView(
                        parentAssetType: entityDetailVM.parentAssetType,
                        key: entityDetailVM.entity?.getSelectableId() ?? "",
                        selectedTab: $selectedTab,
                        selectedField: $selectedField,
                        fileSelectedField: $fileSelectedField,
                        bottomViewPopupData: $bottomViewPopupData,
                        headerHeight: .constant(0),
                        supportFields: entityDetailVM.supportFields
                    )
                    .environmentObject(entityDetailVM)
                }
                .scrollTargetLayout()
            }
            .background(.white)
            .materialTabItem(
                tab: item.tabType,
                label: .primary(
                    item.count > 0 ? "\(item.label) (\(item.count))" : item.label,
                    icon: nil
                )
            )
        }
    }
)

vchaubey-ontic avatar Sep 12 '25 05:09 vchaubey-ontic

This isn't something I've looked into. However, the general approach would be to fade the header background and title out as you pull down. I did a quick prototype and unfortunately it glitches out. But the basic approach is there:

https://github.com/user-attachments/assets/e5c125c4-3f2a-4ef3-b117-1e0f4f7948cd

To accomplish this, I added a modifier like this to things that needed to fade out:

.opacity(max(0, min(1, 1 + Double(context.offset) / 60)))

The spinner is further down than normal because the scroll view doesn't extend to the top of the screen. It would probably take some effort to change this.

I would need some time to see if I can work out the glitch. Is this what you're looking for?

wtmoose avatar Sep 12 '25 18:09 wtmoose