Git Product home page Git Product logo

swiftui-flow-layout's Introduction

SwiftUIFlowLayout

A Flow Layout is a container that orders its views sequentially, breaking into a new "line" according to the available width of the screen. You can compare it to a left-aligned block of text, where every word is a View. A common use for this layout is to create a tag cloud.

The end result looks like this:

in action

  • The layout algorithm behaves differently if your FlowLayout is nested in a VStack or a scrollable parent, such as ScrollView or a List. Therefore, there's the Mode enum and mode property.

Installation

This component is distrubuted as a Swift package. Just add this URL to your package list:

https://github.com/globulus/swiftui-flow-layout

You can also use CocoaPods:

pod 'SwiftUIFlowLayout', '~> 1.0.4'

Sample usage

import SwiftUIFlowLayout

struct FlowLayout_Previews: PreviewProvider {
  static var previews: some View {
    FlowLayout(mode: .scrollable,
               items: ["Some long item here", "And then some longer one",
                       "Short", "Items", "Here", "And", "A", "Few", "More", 
                       "And then a very very very long one"],
               itemSpacing: 4) {
      Text($0)
        .font(.system(size: 12))
        .foregroundColor(.black)
        .padding()
        .background(RoundedRectangle(cornerRadius: 4)
                               .border(Color.gray)
                               .foregroundColor(Color.gray))
    }.padding()
  }
}

Recipe

Check out this recipe for in-depth description of the component and its code. Check out SwiftUIRecipes.com for more SwiftUI recipes!

Changelog

  • 1.0.5 - Using preferences key to read view height.
  • 1.0.4 - Fixed crash when changing item count.
  • 1.0.3 - Removed Hashable constraint on data. Added convenience initializer when refresh binding isn't used.
  • 1.0.2 - Fixed layout issues with multiline items.
  • 1.0.1 - Added itemSpacing parameter.
  • 1.0.0 - Initial release.

swiftui-flow-layout's People

Contributors

globulus avatar gordan-glavas-codecons avatar ivanmkc avatar ptxmac avatar wacumov avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

swiftui-flow-layout's Issues

FlowLayout Error in iOS 13.7

then I used package of FlowLayout in my project and I run the app with iOS 13.7, the app crash.
Could you please make changes for < iOS 14
Thank you

FlowLayout 1 0 3

Handle view with @Binding

Hello,

I have a question regarding the library:
My "chips" are actually "selectable" and have an internal state (isSelected) that can be changed by the user by tapping on them.

Assuming the views I am passing to the FlowLayout has a binding I have the following problem:

@Binding var items: [SomeType]

FlowLayout(mode: .scrollable,
               binding: $items,
               items: items,
               itemSpacing: 4) {
      MyChip( ??? ) // How can I pass the binding here to have back the change of selected/unselected
    }.padding()

Am I misunderstanding something about how to use it?

Thanks for the help

Issue when combining with button

When tying to display buttons instead of inactive view, get 'Contextual closure type '() -> Label' expects 0 arguments, but 1 was used in closure body' error.

Example code:

enum CloudType: String, CaseIterable, Codable {
    case Azure
    case Google
    case Amazon
}

struct ContentView: View {
    let cloudTypes: [CloudType] = [.Azure, .Google, .Amazon]
    var body: some View {
        FlowLayout(mode: .scrollable,
                   items: cloudTypes.map { $0.rawValue },
                      itemSpacing: 4) {
                Text($0)
                    .padding(.vertical, 8)
                    .padding(.horizontal, 24)
                    .background(RoundedRectangle(cornerRadius: 32).fill(.blue))
                    .foregroundColor(.white)
                    .font(.subheadline)
           }.padding()
    }
}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.