SwiftUI 列表禁用单元格按下
SwiftUI List disable cell press
我正在使用 xCode 11 beta 7 和 SwiftUI。
我有一个简单的列表,每个列表元素都有几个按钮。当前,当用户按下单元格(而不是按钮)时,它会突出显示列表单元格的背面(可能不是 SwiftUI 的正确术语)。
如何禁用此行为?我找不到明显的 api 来禁用它。
List {
HStack {
Group {
Button(action: {}) {
Text("Read").padding(5)
}.onTapGesture {
print("1")
}
.padding()
.background(Color.blue)
.cornerRadius(5)
}
Group {
Button(action: {}) {
Text("Notify").padding(5)
}.onTapGesture {
print("2")
}
.padding()
.background(Color.purple)
.cornerRadius(5)
}
Group {
Button(action: {}) {
Text("Write").padding(5)
}.onTapGesture {
print("3")
}
.padding()
.background(Color.yellow)
.cornerRadius(5)
}
}
}
尝试使用手势代替按钮
Group {
Text("Notify").padding(5).gesture(TapGesture().onEnded() {
print("action2")
})
.padding()
.background(Color.purple)
.cornerRadius(5)
}
Same answer as in How to remove highlight on tap of List with SwiftUI?
我知道我有点晚了,但这是给那些正在搜索的人(比如我)
我发现了什么
我想你应该看看这篇短文How to disable the overlay color for images inside Button and NavigationLink from @TwoStraws
只需将 .buttonStyle(PlainButtonStyle())
修饰符添加到 List
中的项目,您就会得到想要的东西。它还使 Button
s 在 List
中再次工作,这是我遇到的另一个问题。
Swift 5.1 的工作示例:
import Combine
import SwiftUI
struct YourItem: Identifiable {
let id = UUID()
let text: String
}
class YourDataSource: ObservableObject {
let willChange = PassthroughSubject<Void, Never>()
var items = [YourItem]()
init() {
items = [
YourItem(text: "Some text"),
YourItem(text: "Some other text")
]
}
}
struct YourItemView: View {
var item: YourItem
var body: some View {
VStack(alignment: .leading) {
Text(item.text)
HStack {
Button(action: {
print("Like")
}) {
Image(systemName: "heart.fill")
}
Button(action: {
print("Star")
}) {
Image(systemName: "star.fill")
}
}
}
.buttonStyle(PlainButtonStyle())
}
}
struct YourListView: View {
@ObservedObject var dataSource = YourDataSource()
var body: some View {
List(dataSource.items) { item in
YourItemView(item: item)
}
.navigationBarTitle("List example", displayMode: .inline)
.edgesIgnoringSafeArea(.bottom)
}
}
#if DEBUG
struct YourListView_Previews: PreviewProvider {
static var previews: some View {
YourListView()
}
}
#endif
正如文章中所说,它也适用于 NavigationLink
s。我希望它对你们中的一些人有所帮助
这是对我有用的最简单的解决方案(瞧,我正在 Swift 和 SwiftUI 中构建我的第一个应用程序,这是我的首先 post 在 SO):
在任何有按钮的地方,添加 .buttonStyle(BorderlessButtonStyle())
Button(action:{}){
Text("Hello")
}.buttonStyle(BorderlessButtonStyle())
然后在您的列表中添加 .onTapGesture {return}
List{
Text("Hello")
}.onTapGesture {return}
我正在使用 xCode 11 beta 7 和 SwiftUI。
我有一个简单的列表,每个列表元素都有几个按钮。当前,当用户按下单元格(而不是按钮)时,它会突出显示列表单元格的背面(可能不是 SwiftUI 的正确术语)。
如何禁用此行为?我找不到明显的 api 来禁用它。
List {
HStack {
Group {
Button(action: {}) {
Text("Read").padding(5)
}.onTapGesture {
print("1")
}
.padding()
.background(Color.blue)
.cornerRadius(5)
}
Group {
Button(action: {}) {
Text("Notify").padding(5)
}.onTapGesture {
print("2")
}
.padding()
.background(Color.purple)
.cornerRadius(5)
}
Group {
Button(action: {}) {
Text("Write").padding(5)
}.onTapGesture {
print("3")
}
.padding()
.background(Color.yellow)
.cornerRadius(5)
}
}
}
尝试使用手势代替按钮
Group {
Text("Notify").padding(5).gesture(TapGesture().onEnded() {
print("action2")
})
.padding()
.background(Color.purple)
.cornerRadius(5)
}
Same answer as in How to remove highlight on tap of List with SwiftUI?
我知道我有点晚了,但这是给那些正在搜索的人(比如我)
我发现了什么
我想你应该看看这篇短文How to disable the overlay color for images inside Button and NavigationLink from @TwoStraws
只需将 .buttonStyle(PlainButtonStyle())
修饰符添加到 List
中的项目,您就会得到想要的东西。它还使 Button
s 在 List
中再次工作,这是我遇到的另一个问题。
Swift 5.1 的工作示例:
import Combine
import SwiftUI
struct YourItem: Identifiable {
let id = UUID()
let text: String
}
class YourDataSource: ObservableObject {
let willChange = PassthroughSubject<Void, Never>()
var items = [YourItem]()
init() {
items = [
YourItem(text: "Some text"),
YourItem(text: "Some other text")
]
}
}
struct YourItemView: View {
var item: YourItem
var body: some View {
VStack(alignment: .leading) {
Text(item.text)
HStack {
Button(action: {
print("Like")
}) {
Image(systemName: "heart.fill")
}
Button(action: {
print("Star")
}) {
Image(systemName: "star.fill")
}
}
}
.buttonStyle(PlainButtonStyle())
}
}
struct YourListView: View {
@ObservedObject var dataSource = YourDataSource()
var body: some View {
List(dataSource.items) { item in
YourItemView(item: item)
}
.navigationBarTitle("List example", displayMode: .inline)
.edgesIgnoringSafeArea(.bottom)
}
}
#if DEBUG
struct YourListView_Previews: PreviewProvider {
static var previews: some View {
YourListView()
}
}
#endif
正如文章中所说,它也适用于 NavigationLink
s。我希望它对你们中的一些人有所帮助
这是对我有用的最简单的解决方案(瞧,我正在 Swift 和 SwiftUI 中构建我的第一个应用程序,这是我的首先 post 在 SO):
在任何有按钮的地方,添加 .buttonStyle(BorderlessButtonStyle())
Button(action:{}){
Text("Hello")
}.buttonStyle(BorderlessButtonStyle())
然后在您的列表中添加 .onTapGesture {return}
List{
Text("Hello")
}.onTapGesture {return}