SwiftUI로 List 위에 Button을 놓을 경우 List 자체에 이벤트를 빼앗기지 않게 한다
BorderlessButtonStyle
또는 PlainButtonStyle
로 설정해야합니다.(이 기사는 Xcode 12.4의 SwiftUI에서의 이야기입니다)
주제
해결 방법
Button으로 BorderlessButtonStyle
또는 PlainButtonStyle
스타일 설정
//: A UIKit based Playground for presenting user interface
import UIKit
import SwiftUI
import PlaygroundSupport
struct ContentView: View {
var body: some View {
List {
HStack {
Text("Cell 1")
Spacer()
Button(action: {
print("B_1押したね")
}, label: {
Text("Border")
})
.buttonStyle(BorderlessButtonStyle())
Button(action: {
print("P_1押したね")
}, label: {
Text("Plain")
})
.buttonStyle(PlainButtonStyle())
}
}
}
}
PlaygroundPage.current.liveView = UIHostingController(rootView: ContentView())
이것으로 해결. 탭 이벤트는 List가 아닌 버튼으로 반응하게 되었다.
디자인적인 것은 Button이 아니라 내부의 Text에 적용해 가면 좋다.
사족: 왜 Button 스타일로 판단하는지 생각
모든 스타일을 적용해보기
그 밖에도 DefaultButtonStyle
라고 하는 것이 있으므로 그것도 적용해 본다. 결과는 List를 탭할 수 있게 되어 버린다. 즉 이것이 기본인가?
//: A UIKit based Playground for presenting user interface
import UIKit
import SwiftUI
import PlaygroundSupport
struct ContentView: View {
var body: some View {
List {
HStack {
Text("Cell 1")
Spacer()
Button(action: {
print("B_1押したね")
}, label: {
Text("Border")
})
.buttonStyle(BorderlessButtonStyle())
Button(action: {
print("P_1押したね")
}, label: {
Text("Plain")
})
.buttonStyle(PlainButtonStyle())
Button(action: {
print("D_1押したね")
}, label: {
Text("Default")
})
.buttonStyle(DefaultButtonStyle())
}
}
}
}
PlaygroundPage.current.liveView = UIHostingController(rootView: ContentView())
왜 Button 스타일로 판단하는지
//: A UIKit based Playground for presenting user interface
import UIKit
import SwiftUI
import PlaygroundSupport
struct ContentView: View {
var body: some View {
List {
HStack {
Text("Cell 1")
Spacer()
Button(action: {
print("B_1押したね")
}, label: {
Text("Border")
})
.buttonStyle(BorderlessButtonStyle())
Button(action: {
print("P_1押したね")
}, label: {
Text("Plain")
})
.buttonStyle(PlainButtonStyle())
}
}
}
}
PlaygroundPage.current.liveView = UIHostingController(rootView: ContentView())
모든 스타일을 적용해보기
그 밖에도
DefaultButtonStyle
라고 하는 것이 있으므로 그것도 적용해 본다. 결과는 List를 탭할 수 있게 되어 버린다. 즉 이것이 기본인가?//: A UIKit based Playground for presenting user interface
import UIKit
import SwiftUI
import PlaygroundSupport
struct ContentView: View {
var body: some View {
List {
HStack {
Text("Cell 1")
Spacer()
Button(action: {
print("B_1押したね")
}, label: {
Text("Border")
})
.buttonStyle(BorderlessButtonStyle())
Button(action: {
print("P_1押したね")
}, label: {
Text("Plain")
})
.buttonStyle(PlainButtonStyle())
Button(action: {
print("D_1押したね")
}, label: {
Text("Default")
})
.buttonStyle(DefaultButtonStyle())
}
}
}
}
PlaygroundPage.current.liveView = UIHostingController(rootView: ContentView())
왜 Button 스타일로 판단하는지
구체적으로는 List가 2행으로 되어 있는 경우, 1행째는 Cell에는 탭할 수 없지만, 2행째는 Cell에도 탭할 수 있다.
//: A UIKit based Playground for presenting user interface
import UIKit
import SwiftUI
import PlaygroundSupport
struct ContentView: View {
var body: some View {
List {
HStack {
Text("Cell 1")
Spacer()
Button(action: {
print("B_1押したね")
}, label: {
Text("Border")
})
.buttonStyle(BorderlessButtonStyle())
Button(action: {
print("P_1押したね")
}, label: {
Text("Plain")
})
.buttonStyle(PlainButtonStyle())
}
HStack {
Text("Cell 2")
Spacer()
Button(action: {
print("D_2押したね")
}, label: {
Text("Default")
})
.buttonStyle(DefaultButtonStyle())
}
}
}
}
PlaygroundPage.current.liveView = UIHostingController(rootView: ContentView())
Reference
이 문제에 관하여(SwiftUI로 List 위에 Button을 놓을 경우 List 자체에 이벤트를 빼앗기지 않게 한다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/yimajo/items/f63d38edd4597b97835a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)