Могу ли я закруглить углы фона HStack, не обрезая содержимое внутри него?

#ios #swift #swiftui

#iOS #swift #swiftui

Вопрос:

Я разрабатываю приложение, в котором я использую панель вкладок, используя HStack{} внутри нее функции кнопок, как показано здесь: https://i.stack.imgur.com/18Amd.png и я пытаюсь обойти углы бара.

Я пробовал использовать .clipShape(RoundedRectangle(cornerRadius:20)) , но это приведет к вырезанию любого содержимого за пределами фона: https://i.stack.imgur.com/zVZb6.png .

Есть ли способ закруглить углы фона HStack, не вырезая кнопки внутри него?

Я использую Xcode 12.0 с SwiftUI.

Код, который я использую, находится здесь:

 struct TabBar: View {

@Binding var selectedTab : Int

//To assign item color when selected
@State var icon = "unSelect"

var body: some View {
   
    //Icon Design
    HStack(alignment: .center) {
        Group {

            //Home Icon
            Button(action: {
                self.selectedTab = 0
            }) {
                HStack(spacing: 5) {
                    Image("Home").resizable()
                        .frame(width: 40, height: 40)
                }
                .padding(5)
            }
            .foregroundColor(self.selectedTab == 0 ? Color("Select") : Color("unSelect"))
            
            //Chart Icon
            Button(action: {
                self.selectedTab = 1
            }) {
                HStack(spacing: 5) {
                    Image("Chart").resizable()
                        .frame(width: 40, height: 40)
                }
                .padding(5)
            }
            .foregroundColor(self.selectedTab == 1 ? Color("Select") : Color("unSelect"))

            //Add Icon
            Button(action: {
                self.selectedTab = 2
            }) {
                HStack(spacing: 5) {
                    Image("Add")
                        .resizable()
                        .frame(width: 83.52, height: 83.52, alignment: .top)
                        .overlay(Circle().stroke(Color("Tab"), lineWidth: 8))
            
                }
                .offset(y: -17)
                .edgesIgnoringSafeArea(.all)
            }
            
            //Log Icon
            Button(action: {
                self.selectedTab = 3
            }) {
                HStack(spacing: 54) {
                    Image("Log").resizable()
                        .frame(width: 50, height: 50)
                }
                .padding(4)
            }
            .foregroundColor(self.selectedTab == 3 ? Color("Select") : Color("unSelect"))
            
            //Settings Icon
            Button(action: {
                self.selectedTab = 4
            }) {
                HStack(spacing: 5) {
                    Image("Settings").resizable()
                        .frame(width: 40, height: 40)
                }
                .padding(5)
            }
            .foregroundColor(self.selectedTab == 4 ? Color("Select") : Color("unSelect"))
        }
    }
    .padding(.vertical, -10)
    .padding(.horizontal, 30)
    .background(Color("Tab"))
    .padding(.top)
    .padding(.top)
    .clipShape(RoundedRectangle(cornerRadius:20))

}
  

Ответ №1:

Попробуйте применить .clipShape к Color() внутренней части .background() :

 .background(Color("Tab").clipShape(RoundedRectangle(cornerRadius:20)))
  

и удалите его с конца.

Ответ №2:

Попробуйте добавить отступ перед .clipShape(RoundedRectangle(cornerRadius:20)):

 .padding(.top)
  

Комментарии:

1. Я пробовал это, но теперь верхние углы не закруглены. Мне нужно сделать четыре угла закругленными, не затрагивая кнопки внутри, чтобы они не были вырезаны.