SwiftUI HStack with Wrap

后端 未结 4 591
孤街浪徒
孤街浪徒 2020-11-29 07:08

Is it possible that the blue tags (which are currently truncated) are displayed completely and then it automatically makes a line break?

NavigationLink(desti         


        
4条回答
  •  再見小時候
    2020-11-29 07:37

    Here is some approach of how this could be done using alignmentGuide(s). It is simplified to avoid many code post, but hope it is useful.

    Update: There is also updated & improved variant of below solution in my answer for SwiftUI HStack with wrap and dynamic height

    This is the result:

    swiftui wrapped layout

    And here is full demo code (orientation is supported automatically):

    import SwiftUI
    
    struct TestWrappedLayout: View {
        @State var platforms = ["Ninetendo", "XBox", "PlayStation", "PlayStation 2", "PlayStation 3", "PlayStation 4"]
    
        var body: some View {
            GeometryReader { geometry in
                self.generateContent(in: geometry)
            }
        }
    
        private func generateContent(in g: GeometryProxy) -> some View {
            var width = CGFloat.zero
            var height = CGFloat.zero
    
            return ZStack(alignment: .topLeading) {
                ForEach(self.platforms, id: \.self) { platform in
                    self.item(for: platform)
                        .padding([.horizontal, .vertical], 4)
                        .alignmentGuide(.leading, computeValue: { d in
                            if (abs(width - d.width) > g.size.width)
                            {
                                width = 0
                                height -= d.height
                            }
                            let result = width
                            if platform == self.platforms.last! {
                                width = 0 //last item
                            } else {
                                width -= d.width
                            }
                            return result
                        })
                        .alignmentGuide(.top, computeValue: {d in
                            let result = height
                            if platform == self.platforms.last! {
                                height = 0 // last item
                            }
                            return result
                        })
                }
            }
        }
    
        func item(for text: String) -> some View {
            Text(text)
                .padding(.all, 5)
                .font(.body)
                .background(Color.blue)
                .foregroundColor(Color.white)
                .cornerRadius(5)
        }
    }
    
    struct TestWrappedLayout_Previews: PreviewProvider {
        static var previews: some View {
            TestWrappedLayout()
        }
    }
    

提交回复
热议问题