我目前有一个简单的 SwiftUI ScrollView,其中包含单个元素。我添加了
.refreshable(action: )
属性以允许(下拉)刷新视图。但是,这只会在拉动刷新时显示默认的灰色微调器。有没有办法可以改变微调器的颜色/样式?
将 onAppear 添加到您的列表并放置
.onAppear {
UIRefreshControl.appearance().tintColor = .green
UIRefreshControl.appearance().attributedTitle = NSAttributedString("Refreshing…")
}
我想添加我的方法,是一种非常非正统的方法,我并不是说这是“解决方案”,只是要讨论的内容,希望它可以帮助某人“测试”并找到更好的角度。
将您的内容放在一个列表中,这将为您提供 .refreshable 修饰符并允许拉动刷新:SWIFTUI 可刷新(拉动刷新)在 ScrollView 上不起作用
创建 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
}
}
最后将此单例视图添加到刷新控制器并隐藏原始视图:
.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
您可以使用
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
}