0

I need to add two different types of view in same grid view, there is an alignment issue between these view as shown in give image below. The view which contains image is taking more space from top and bottom even after fixing the size Alignment Issue

    struct TestView: View {
    
    @StateObject var vm = BusinessProfileViewModel()
    @Environment(\.presentationMode) private var presentationMode
    
    let columns = [
        GridItem(.flexible(minimum: 100), spacing: 20),
        GridItem(.flexible(minimum: 100), spacing: 20)
    ]
    
    
    var body: some View {
        loadView()
            
    }
}



extension TestView {
    
    
    func loadView() -> some View {
        GeometryReader { geometry in
            ZStack(alignment: .bottomTrailing) {
                ScrollView(.vertical, showsIndicators: false) {
                    topBusinessImage(geometry: geometry)
                    
                    VStack {
                        featureProduct(geometry: geometry)
                        
                    }.padding()
                    
                }.edgesIgnoringSafeArea(.top)
                
                
            }
        }
    }
    
    
    func topBusinessImage(geometry: GeometryProxy) -> some View {
        VStack(spacing: 0) {
            // Profile Image Stack
            
            // Banner Zstack
            ZStack (alignment: .top) {
                
                Image(ImageName.productPlaceholder.rawValue)
                    .resizable()
                    .frame(height: geometry.size.height / 2.5)
                
            }
        }
    }
    
    
    
    func featureProduct(geometry: GeometryProxy) -> some View {
        VStack(alignment: .leading) {
            
            // product and services button
            HStack {
                Text("Products & Services")
                    .font(.custom(Popins.bold.rawValue, size: 20))
                
                Spacer()
                
                Button {
                    print("list")
                } label: {
                    Image(ImageName.list.rawValue)
                        .resizable()
                        .frame(width: 24, height: 24)
                }.padding(5)
                
            }
            
            
            
            LazyVGrid(columns: columns, spacing: 30) {
                BusinessProductCell()
                ProductOnlyDetailCell()
                ProductOnlyDetailCell()
                BusinessProductCell()
                
            }
        }
    }
}
    
    struct TestView_Previews: PreviewProvider {
        static var previews: some View {
            TestView()
        }
    }

view that contains image

    import SwiftUI

struct BusinessProductCell: View {
    
    
    var body: some View {
        loadView()
    }
}


extension BusinessProductCell {
    
    func loadView() -> some View {
        VStack(alignment: .leading) {
            
            ZStack(alignment: .topLeading) {

                    Image(ImageName.business.rawValue)
                        .resizable()
                        .frame(height: 205)
                        .cornerRadius(10)

                HStack {
                
                    Button {
                        print("fav")
                    } label: {
                        Image(systemName: "heart.fill")
                            .resizable()
                            .scaledToFit()
                            .foregroundColor(UnifiedColor.blue)
                            .frame(width: 20, height: 20)
                    }.padding()
                    
                    Spacer()
                    
                    Button {
                        print("fav")
                    } label: {
                        Image(systemName: "ellipsis")
                            .resizable()
                            .scaledToFit()
                            .frame(width: 20)
                            .foregroundColor(.white)
                    }.padding()
                }
                
                

            }
            
            Text("Dove Body Care")
                .foregroundColor(.black)
                .font(.custom(Popins.medium.rawValue, size: 16))

            HStack {
                Text("$49.99")
                    .font(.custom(Popins.medium.rawValue, size: 12))
                    .foregroundColor(UnifiedColor.textBlue)
                Spacer()
                
                HStack {
                    Text("(286 Favorites)")
                        .font(.custom(Popins.regular.rawValue, size: 8))
                        .foregroundColor(.gray)
                    Image(ImageName.heart_line.rawValue)
                        .resizable()
                        .frame(width: 15, height: 15)
                }
            }
            
            
        }
    }
    
}
struct BusinessProductCell_Previews: PreviewProvider {
    static var previews: some View {
        BusinessProductCell()
            .frame(width: 200, height: 250)
    }
}

View that only contains text or second view for gird view

struct ProductOnlyDetailCell: View {
    
    
    var body: some View {
        loadView()
    }
}


extension ProductOnlyDetailCell {
    
    func loadView() -> some View {
        VStack(alignment: .leading, spacing: 10) {
            
            HStack {
                Image(ImageName.productPlaceholder.rawValue)
                    .resizable()
                    .scaledToFill()
                    .frame(width: 24, height: 24)
                    .clipShape(Circle())
                    .overlay {
                        Circle().stroke(.white, lineWidth: 1)
                    }
                
                Text("Anton Jr.")
                    .font(.custom(Popins.regular.rawValue, size: 12 ))
                    .foregroundColor(.black)
                    .lineLimit(1)
                
                Spacer()
                
                Button {
                    print("more btn")
                } label: {
                    Image(systemName: "ellipsis")
                        .resizable()
                        .foregroundColor(.black)
                        .frame(width: 18, height: 4)
                        .padding([.trailing, .top, .bottom])
                }
                
            }
            
            Text("DJ for night")
                .font(.custom(Popins.bold.rawValue, size: 14))
                .foregroundColor(.black)
            Text("Lorem ipsum dolor sitamet, consectetur adipiscingelit. Lectus idcommodoegestas metusinterdum dolor.")
                .multilineTextAlignment(.leading)
                .font(.custom(Popins.regular.rawValue, size: 12))
                .foregroundColor(.black)
                .opacity(0.8)
            
            Spacer()
            
            HStack (spacing: 0){
                Text("$15K")
                    .font(.custom(Popins.bold.rawValue, size: 14))
                    .foregroundColor(.black)
                Text("/")
                    .font(.custom(Popins.bold.rawValue, size: 14))
                    .foregroundColor(.gray)
                Text("Night")
                    .font(.custom(Popins.regular.rawValue, size: 14))
                    .foregroundColor(.gray)
            }
            
            Text("25 minute ago")
                .font(.custom(Popins.regular.rawValue, size: 10))
                .foregroundColor(.gray)
            
            
        }
        .padding(10)
        .background(
            RoundedRectangle(cornerRadius: 10)
                .foregroundColor(.gray.opacity(0.1))
        )
        
    }
}
Qazi Ammar
  • 953
  • 1
  • 8
  • 23

0 Answers0