可自定义刷新微调器

问题描述 投票:0回答:3

我目前有一个简单的 SwiftUI ScrollView,其中包含单个元素。我添加了

.refreshable(action: )
属性以允许(下拉)刷新视图。但是,这只会在拉动刷新时显示默认的灰色微调器。有没有办法可以改变微调器的颜色/样式?

ios swiftui
3个回答
1
投票

将 onAppear 添加到您的列表并放置

  .onAppear {
                        UIRefreshControl.appearance().tintColor = .green
                        UIRefreshControl.appearance().attributedTitle = NSAttributedString("Refreshing…")
                    }

0
投票

我想添加我的方法,是一种非常非正统的方法,我并不是说这是“解决方案”,只是要讨论的内容,希望它可以帮助某人“测试”并找到更好的角度。

  • 另外我只在iOS15上测试过这个,在iOS16上不起作用
  1. 将您的内容放在一个列表中,这将为您提供 .refreshable 修饰符并允许拉动刷新:SWIFTUI 可刷新(拉动刷新)在 ScrollView 上不起作用

  2. 创建 UIView 的单例(这是非常不寻常的,但对于这种情况可能有效)

     class SingletonView: UIView { 
     // Singleton instance
         static let shared : UIView = 
     SingletonView.sharedInstance(size: CGSize(width: 20, height: 20))
    
         // You can modify argument list as per your need.
         class private func sharedInstance(size : CGSize)->UIView {
             //Putting the view in the middle, but the details falls on you.
             let view = UIView(frame: CGRect(x: (UIScreen.main.bounds.width / 2) - 10, y: 0, width: size.width, height: size.height))
       //just so you can see something
         view.backgroundColor = .red
             return view
         }
    }
    
  3. 最后将此单例视图添加到刷新控制器并隐藏原始视图:

     .onAppear{
    //Hide the default refresh controller, attach our uiView
         //Because is a singleton it wont be added several times
         //You can always expand your singleton to be hidden, animated, removed, etc.
    UIRefreshControl.appearance().tintColor = .clear
    
    
    UIRefreshControl.appearance().addSubview(SingletonView.shared)
    
     }
    

要点:https://gist.github.com/Wilsonilo/309600c62c9e27385dfa5296e696b668


0
投票

您可以使用

SwiftUIIntrospect
库直接更改特定滚动视图的刷新微调器的颜色。无需黑客攻击,无需全局 UI 设置。适用于
ScrollView
List
List
UICollectionView
UITableView
,具体取决于 iOS 版本,两者都是
UIScrollView
)。

有了

UIScrollView
UIRefreshControl
,您现在可以使用任何您想要修改的
UIKit
方法来修改您需要的任何内容。

List { // Or ScrollView
    Text("Placeholder")
}
.refreshable {
    /// Your refresh action
}
.introspect(.scrollView, on: .iOS(.v17, .v16, .v15)) { scrollView in
    // Do any modifications to the `refreshControl`
    scrollView.refreshControl?.tintColor = .green
}
© www.soinside.com 2019 - 2024. All rights reserved.