skip to Main Content

I have two views: CreateExerciseView and RepsViewStyle. Although CreateExerciseView has other view elements, I will condense the code to demonstrate my specific issue. It seems that the picker is not displaying with the desired colour I want, instead not appearing at all or in some cases, appearing as default blue text.

The CreateExerciseView which incorrectly displays the picker colour

Here is the condensed CreateExerciseView code:

struct CreateExerciseView: View {
  // Reps/Sets Properties
  @State var reps: String = "1 rep"
  @State var sets: String = "1 set"
  var body: some View {
    Group {
        // MARK: REPS AND SETS
        RepsViewStyle(reps: $reps, sets: $sets)
    }          
    .padding(.horizontal)              
  }
}

And here is the RepsViewStyle code:

struct RepsViewStyle: View {
    @Binding var reps: String
    @Binding var sets: String
    var body: some View {
        VStack {
            HStack {
                Text("Select repetitions and sets: ")
                    .fontWeight(.semibold)
                    .padding([.top, .trailing])
                
                Spacer()
            }
            
            Divider()
            
            HStack {
                
                Spacer()
                
                Picker(selection: $reps,
                       label: Text("(reps)"),
                       content: {
                        ForEach(1..<100) { number in
                            if number == 1 {
                                Text("(number) rep")
                                    .tag("(number) rep")
                            } else {
                                Text("(number) reps")
                                    .tag("(number) reps")
                            }
                        }
                        
                       })
                    .pickerStyle(MenuPickerStyle())
                    .padding(12)
                    .padding(.horizontal, 20)
                    .background(Color.MyTheme.redColor)
                    .cornerRadius(10)
                    .shadow(color: Color.MyTheme.greyColor.opacity(0.3), radius: 10, x: 0, y: 10)
                    .foregroundColor(Color.white)
                    .font(.headline)
                
                
                
                Picker(selection: $sets,
                       label: Text("(sets)"),
                       content: {
                        ForEach(1..<20) { number in
                            if number == 1 {
                                Text("(number) set")
                                    .tag("(number) set")
                            } else {
                                Text("(number) sets")
                                    .tag("(number) sets")
                            }
                        }
                        
                       })
                    .pickerStyle(MenuPickerStyle())
                    .padding(12)
                    .padding(.horizontal, 20)
                    .background(Color.MyTheme.redColor)
                    .cornerRadius(10)
                    .shadow(color: Color.MyTheme.greyColor.opacity(0.3), radius: 10, x: 0, y: 10)
                    .foregroundColor(Color.white)
                    .font(.headline)
                
                Spacer()
            }
            .padding()
        }
    }
}

I have tried applying attributes to both the calling of the RepsViewStyle from the initial view as well as the pickers themselves but they do not seem to change at all.

2

Answers


  1. You can add .accentColor(.white) to the Pickers, replacing .foregroundColor(Color.white) to set the "label" color white,
    rather than the default blue color, if that is what you wanted to acheive.

    Login or Signup to reply.
  2. As mentioned it is difficult to style Picker in pure SwiftUI, as custom PickerStyles are not (yet) public.

    A workaround for your case might be using Menu instead. The styling on this one works.

                    Menu {
                        ForEach(1..<100) { number in
                            Button { reps = "(number) reps" } label: {
                                if number == 1 {
                                    Text("(number) rep")
                                } else {
                                    Text("(number) reps")
                                }
                            }
                        }
                    } label: {
                        Text("(reps)")
                            .foregroundStyle(.white)
                            .font(.headline)
                            .padding(12)
                            .padding(.horizontal, 20)
                            .background(Color.red)
                            .cornerRadius(10)
                            .shadow(color: Color.gray.opacity(0.3), radius: 10, x: 0, y: 10)
                    }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search