SwiftUI Segmented Picker 在点击时不切换
SwiftUI Segmented Picker does not switch when click on it
我正在尝试使用 SwiftUI 实现分段控制。出于某种原因,分段选择器在单击时不会在值之间切换。我浏览了很多教程,但找不到与我的代码有任何区别:
struct MeetingLogin: View {
@State private var selectorIndex: Int = 0
init() {
UISegmentedControl.appearance().backgroundColor = UIColor(named: "JobsLightGreen")
UISegmentedControl.appearance().selectedSegmentTintColor = UIColor(named: "AlmostBlack")
UISegmentedControl.appearance().setTitleTextAttributes([.foregroundColor: UIColor.white,
.font: UIFont(name: "OpenSans-Bold", size: 13)!],
for: .selected)
UISegmentedControl.appearance().setTitleTextAttributes([.foregroundColor: UIColor.white,
.font: UIFont(name: "OpenSans-Regular", size: 13)!],
for: .normal)
}
var body: some View {
VStack {
...
Group {
Spacer().frame(minHeight: 8, maxHeight: 30)
Picker("video", selection: $selectorIndex) {
Text("Video On").tag(0)
Text("Video Off").tag(1)
}
.pickerStyle(SegmentedPickerStyle())
.padding([.leading, .trailing], 16)
Spacer().frame(minHeight: 8, maxHeight: 50)
Button(action: { self.sendPressed() }) {
ZStack {
RoundedRectangle(cornerRadius: 100)
Text("go")
.font(.custom("Roboto-Bold", size: 36))
.foregroundColor(Color("MeetingGreen"))
}
}
.foregroundColor(Color("MeetingLightGreen").opacity(0.45))
.frame(width: 137, height: 73)
}
Spacer()
}
}
}
如有任何建议,我们将不胜感激!
您的 code/View 缺少 if 条件以了解当 selectorIndex 为 0 或 1 时会发生什么。
它必须看起来像这样:
var body: some View {
VStack {
if selectorIndex == 0 {
//....Your VideoOn-View
} else {
//Your VideoOff-View
}
}
更新:问题似乎是由于 View
的重叠引起的,因为 RoundedRectangle 的 cornerRadius 值设置为 100。将 cornerRadius 的值设置为 55 将恢复 Picker
的功能。
问题似乎是由 ZStack
中的 RoundedRectangle(cornerRadius: 100)
引起的。我没有解释为什么会这样。如果我发现了,我会添加原因。可能是 SwiftUI 错误。在找到任何相关证据之前,我不能说。所以这里是可以使 SegmentedControl
正常工作的代码。
struct MeetingLogin: View {
//...
@State private var selectorIndex: Int = 0
var body: some View {
VStack {
//...
Group {
Spacer().frame(minHeight: 8, maxHeight: 30)
Picker("video", selection: $selectorIndex) {
Text("Video On").tag(0)
Text("Video Off").tag(1)
}
.pickerStyle(SegmentedPickerStyle())
.padding([.leading, .trailing], 16)
Spacer().frame(minHeight: 8, maxHeight: 50)
Button(action: { self.sendPressed() }) {
ZStack {
RoundedRectangle(cornerRadius: 55)
Text("go")
.font(.custom("Roboto-Bold", size: 36))
.foregroundColor(Color("MeetingGreen"))
}
}
.foregroundColor(Color("MeetingLightGreen").opacity(0.45))
.frame(width: 137, height: 73)
}
Spacer()
}
}
}
Xcode 12 iOS 14
您可以通过在 Segment Control(Picker)
的 tapGesture 上添加 if-else 条件来获取它
@State private var profileSegmentIndex = 0
Picker(selection: self.$profileSegmentIndex, label: Text("Jamaica")) {
Text("My Posts").tag(0)
Text("Favorites").tag(1)
}
.onTapGesture {
if self.profileSegmentIndex == 0 {
self.profileSegmentIndex = 1
} else {
self.profileSegmentIndex = 0
}
}
.pickerStyle(SegmentedPickerStyle())
.padding()
如果您需要将它用于 2 个以上的段,您可以尝试使用枚举 :)
我正在尝试使用 SwiftUI 实现分段控制。出于某种原因,分段选择器在单击时不会在值之间切换。我浏览了很多教程,但找不到与我的代码有任何区别:
struct MeetingLogin: View {
@State private var selectorIndex: Int = 0
init() {
UISegmentedControl.appearance().backgroundColor = UIColor(named: "JobsLightGreen")
UISegmentedControl.appearance().selectedSegmentTintColor = UIColor(named: "AlmostBlack")
UISegmentedControl.appearance().setTitleTextAttributes([.foregroundColor: UIColor.white,
.font: UIFont(name: "OpenSans-Bold", size: 13)!],
for: .selected)
UISegmentedControl.appearance().setTitleTextAttributes([.foregroundColor: UIColor.white,
.font: UIFont(name: "OpenSans-Regular", size: 13)!],
for: .normal)
}
var body: some View {
VStack {
...
Group {
Spacer().frame(minHeight: 8, maxHeight: 30)
Picker("video", selection: $selectorIndex) {
Text("Video On").tag(0)
Text("Video Off").tag(1)
}
.pickerStyle(SegmentedPickerStyle())
.padding([.leading, .trailing], 16)
Spacer().frame(minHeight: 8, maxHeight: 50)
Button(action: { self.sendPressed() }) {
ZStack {
RoundedRectangle(cornerRadius: 100)
Text("go")
.font(.custom("Roboto-Bold", size: 36))
.foregroundColor(Color("MeetingGreen"))
}
}
.foregroundColor(Color("MeetingLightGreen").opacity(0.45))
.frame(width: 137, height: 73)
}
Spacer()
}
}
}
如有任何建议,我们将不胜感激!
您的 code/View 缺少 if 条件以了解当 selectorIndex 为 0 或 1 时会发生什么。
它必须看起来像这样:
var body: some View {
VStack {
if selectorIndex == 0 {
//....Your VideoOn-View
} else {
//Your VideoOff-View
}
}
更新:问题似乎是由于 View
的重叠引起的,因为 RoundedRectangle 的 cornerRadius 值设置为 100。将 cornerRadius 的值设置为 55 将恢复 Picker
的功能。
问题似乎是由 ZStack
中的 RoundedRectangle(cornerRadius: 100)
引起的。我没有解释为什么会这样。如果我发现了,我会添加原因。可能是 SwiftUI 错误。在找到任何相关证据之前,我不能说。所以这里是可以使 SegmentedControl
正常工作的代码。
struct MeetingLogin: View {
//...
@State private var selectorIndex: Int = 0
var body: some View {
VStack {
//...
Group {
Spacer().frame(minHeight: 8, maxHeight: 30)
Picker("video", selection: $selectorIndex) {
Text("Video On").tag(0)
Text("Video Off").tag(1)
}
.pickerStyle(SegmentedPickerStyle())
.padding([.leading, .trailing], 16)
Spacer().frame(minHeight: 8, maxHeight: 50)
Button(action: { self.sendPressed() }) {
ZStack {
RoundedRectangle(cornerRadius: 55)
Text("go")
.font(.custom("Roboto-Bold", size: 36))
.foregroundColor(Color("MeetingGreen"))
}
}
.foregroundColor(Color("MeetingLightGreen").opacity(0.45))
.frame(width: 137, height: 73)
}
Spacer()
}
}
}
Xcode 12 iOS 14 您可以通过在 Segment Control(Picker)
的 tapGesture 上添加 if-else 条件来获取它@State private var profileSegmentIndex = 0
Picker(selection: self.$profileSegmentIndex, label: Text("Jamaica")) {
Text("My Posts").tag(0)
Text("Favorites").tag(1)
}
.onTapGesture {
if self.profileSegmentIndex == 0 {
self.profileSegmentIndex = 1
} else {
self.profileSegmentIndex = 0
}
}
.pickerStyle(SegmentedPickerStyle())
.padding()
如果您需要将它用于 2 个以上的段,您可以尝试使用枚举 :)