{"id":1289,"url":"https://github.com/wayfair-archive/brickkit-ios","last_synced_at":"2025-08-06T13:33:00.338Z","repository":{"id":56903985,"uuid":"71476098","full_name":"wayfair-archive/brickkit-ios","owner":"wayfair-archive","description":"DEPRECATED - BrickKit For IOS ","archived":false,"fork":false,"pushed_at":"2019-10-08T18:23:47.000Z","size":15059,"stargazers_count":603,"open_issues_count":17,"forks_count":57,"subscribers_count":22,"default_branch":"master","last_synced_at":"2024-04-14T23:39:49.901Z","etag":null,"topics":["complex-layouts","ios","swift","tvos","ui-components"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wayfair-archive.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-10-20T15:18:19.000Z","updated_at":"2024-03-16T15:29:01.000Z","dependencies_parsed_at":"2022-08-20T18:50:58.813Z","dependency_job_id":null,"html_url":"https://github.com/wayfair-archive/brickkit-ios","commit_stats":null,"previous_names":["wayfair/brickkit-ios"],"tags_count":31,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wayfair-archive%2Fbrickkit-ios","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wayfair-archive%2Fbrickkit-ios/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wayfair-archive%2Fbrickkit-ios/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wayfair-archive%2Fbrickkit-ios/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wayfair-archive","download_url":"https://codeload.github.com/wayfair-archive/brickkit-ios/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":228686176,"owners_count":17957032,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["complex-layouts","ios","swift","tvos","ui-components"],"created_at":"2024-01-05T20:15:43.044Z","updated_at":"2024-12-09T14:31:08.296Z","avatar_url":"https://github.com/wayfair-archive.png","language":"Swift","funding_links":[],"categories":["Layout","Libs","Layout [🔝](#readme)","Swift"],"sub_categories":["Other Hardware","Layout"],"readme":"\u003cp align=\"center\" \u003e\n  \u003cimg src=\"Docs/Png/header_image.PNG\" alt=\"BrickKit\" title=\"BrickKit\"\u003e\n\u003c/p\u003e\n\n[![Build Status](https://travis-ci.org/wayfair/brickkit-ios.svg)](https://travis-ci.org/wayfair/brickkit-ios)\n[![codecov.io](http://codecov.io/github/wayfair/brickkit-ios/coverage.svg)](http://codecov.io/github/wayfair/brickkit-ios)\n[![Pod Version](https://img.shields.io/cocoapods/v/BrickKit.svg)](http://cocoapods.org/pods/BrickKit)\n[![Pod Platform](https://img.shields.io/cocoapods/p/BrickKit.svg)](http://cocoapods.org/pods/BrickKit)\n[![Pod License](https://img.shields.io/cocoapods/l/BrickKit.svg)](https://github.com/wayfair/brickkit-ios/blob/master/LICENSE)\n[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg)](https://github.com/Carthage/Carthage)\n\n\n# BrickKit is a delightful layout library for iOS and tvOS.  It is written entirely in Swift!\n\n## Deprecated\n\nBrickKit is being phased out at Wayfair, and therefore we will not be maintaining it further.\n\nWith BrickKit, you can create complex and responsive layouts in a simple way. It's easy to use and easy to extend. Create your own reusable bricks and behaviors.\n\n\n## Define your layouts using objects that describe the high-level behavior\n\n```swift\n\nlet section = BrickSection(bricks: [\n    LabelBrick(width: .ratio(ratio: 1), text: \"BRICK 1\"),\n    LabelBrick(width: .ratio(ratio: 1), text: \"MULTI-LINE BRICK MULTI-LINE BRICK MULTI-LINE BRICK MULTI-LINE BRICK MULTI-LINE BRICK MULTI-LINE BRICK MULTI-LINE BRICK MULTI-LINE BRICK MULTI-LINE BRICK MULTI-LINE BRICK MULTI-LINE BRICK MULTI-LINE BRICK MULTI-LINE BRICK MULTI-LINE BRICK MULTI-LINE BRICK MULTI-LINE BRICK MULTI-LINE BRICK MULTI-LINE BRICK\"),\n    LabelBrick(width: .ratio(ratio: 1/2), text: \"1/2 BRICK\"),\n    LabelBrick(width: .ratio(ratio: 1/2), text: \"1/2 BRICK\"),\n    LabelBrick(width: .ratio(ratio: 1/3), text: \"1/3 BRICK\"),\n    LabelBrick(width: .ratio(ratio: 1/3), text: \"1/3 BRICK\"),\n    LabelBrick(width: .ratio(ratio: 1/3), text: \"1/3 BRICK\"),\n    ], inset: 10, edgeInsets: UIEdgeInsets(top: 20, left: 20, bottom: 20, right: 20))\n\nself.setSection(section)\n\n\n```\n### Layout in portrait\n\n![Simple Portrait](Docs/Png/simple_portrait.PNG)\n### Layout in landscape\n\n![Simple Landscape](Docs/Png/simple_landscape.PNG)\n\n## Define heights based on rules\n\n\n```swift\n\n// Calculate height using auto-layout\nLabelBrick(height: .auto(estimate: .fixed(size: 50)), text: \"BRICK\"),\n\n// Fixed Height\nLabelBrick(height: .fixed(size: 50), text: \"BRICK\"),\n\n// Calculate height based on ratio of the width\nLabelBrick(height: .ratio(ratio: 1), text: \"BRICK\"),\n\n// Complex Rule based on size classes and/or orientation\nlet height: BrickDimension =\n    .horizontalSizeClass(\n        regular: .orientation(\n            landscape: .fixed(size: 200),\n            portrait: .fixed(size: 100)\n        ),\n        compact: .orientation(\n            landscape: .fixed(size: 100),\n            portrait: .fixed(size: 50)\n        )\n)\n\n```\n### Height Ratio portrait\n![Height Ratio Portrait](Docs/Png/height_ratio_portrait.PNG)\n### Height Ratio landscape\n![Height Ratio Landscape](Docs/Png/height_ratio_landscape.PNG)\n\n## Complex layouts, using Sections in Sections\n\n```swift\n\nlet section = BrickSection(bricks: [\n    LabelBrick(width: .ratio(ratio: 0.5), text: \"BRICK\"),\n    BrickSection(width: .ratio(ratio: 0.5), bricks: [\n        LabelBrick(text: \"BRICK\\nBRICK\"),\n        LabelBrick(text: \"BRICK\"),\n        LabelBrick(text: \"BRICK\"),\n        ], inset: 10),\n    BrickSection(bricks: [\n        BrickSection(width: .ratio(ratio: 1/3), bricks: [\n            LabelBrick(text: \"BRICK\"),\n            LabelBrick(text: \"BRICK\"),\n            ], inset: 5),\n        BrickSection(width: .ratio(ratio: 2/3), backgroundColor: .brickGray3, bricks: [\n            LabelBrick(text: \"BRICK\"),\n            LabelBrick(text: \"BRICK\"),\n            LabelBrick(text: \"BRICK\"),\n            ], inset: 15),\n        ], inset: 5, edgeInsets: UIEdgeInsets(top: 5, left: 5, bottom: 5, right: 5)),\n    BrickSection(width: .ratio(ratio: 0.5), bricks: [\n        LabelBrick(text: \"BRICK\"),\n        LabelBrick(text: \"BRICK\"),\n        ], inset: 10),\n    LabelBrick(width: .ratio(ratio: 0.5), text: \"BRICK\"),\n    LabelBrick(text: \"BRICK\"),\n    ], inset: 10, edgeInsets: UIEdgeInsets(top: 20, left: 20, bottom: 20, right: 20))\n\nself.setSection(section)\n\n\n```\n\n### Example of Section in Section\n![Multi Sections](Docs/Png/multi_sections.PNG)\n\n## Create your own reuseable Bricks!\n\n```swift\n\nregisterBrickClass(NiblessBrick.self)\n\nlet section = BrickSection(bricks: [\n    NiblessBrick(text: \"BRICK\", image: UIImage(named: \"logo_splash\")!),\n    NiblessBrick(width: .ratio(ratio: 1/2), text: \"BRICK\", image: UIImage(named: \"logo_inapp\")!),\n    NiblessBrick(width: .ratio(ratio: 1/2), text: \"BRICK\", image: UIImage(named: \"logo_inapp\")!)\n    ], inset: 10)\nsetSection(section)\n\n\n```\n\n\u003e BrickKit supports Bricks with Nibs or Nibsless\n\n![Dynamic Sizing](Docs/Png/dynamic_sizing.PNG)\n\n## Use different scroll directions within bricks\n\n```swift\nself.registerBrickClass(CollectionBrick.self)\nself.registerBrickClass(LabelBrick.self)\n\nlet section1 = BrickSection(bricks: [\n    ImageBrick(width: .ratio(ratio: 1/4), height: .ratio(ratio: 1), dataSource: self),\n    ] , inset: 10, edgeInsets: UIEdgeInsets(top: 5, left: 5, bottom: 5, right: 5))\nsection1.repeatCountDataSource = self\n\nlet section2 = BrickSection(bricks: [\n    ImageBrick(width: .ratio(ratio: 1/2), height: .ratio(ratio: 1), dataSource: self),\n    ], inset: 10, edgeInsets: UIEdgeInsets(top: 5, left: 5, bottom: 5, right: 5))\nsection2.repeatCountDataSource = self\n\nlet section3 = BrickSection(bricks: [\n    ImageBrick(width: .fixed(size: 100), height: .ratio(ratio: 1), dataSource: self),\n    ], inset: 10, edgeInsets: UIEdgeInsets(top: 5, left: 5, bottom: 5, right: 5))\nsection3.repeatCountDataSource = self\n\nlet section = BrickSection(bricks: [\n    LabelBrick(text: \"1/4 Ratio\"),\n    CollectionBrick(scrollDirection: .horizontal, dataSource: CollectionBrickCellModel(section: section1), brickTypes: [ImageBrick.self]),\n    LabelBrick(text: \"1/2 Ratio\"),\n    CollectionBrick(scrollDirection: .horizontal, dataSource: CollectionBrickCellModel(section: section2), brickTypes: [ImageBrick.self]),\n    LabelBrick(text: \"100px Fixed\"),\n    CollectionBrick(scrollDirection: .horizontal, dataSource: CollectionBrickCellModel(section: section3), brickTypes: [ImageBrick.self]),\n    ])\nsetSection(section)\n\n```\n\n![horizontal](Docs/Gif/horizontal.gif)\n\n## Dynamic Image Heights\n\nImages are automatically resized based on its content\n\n```swift\n\nregisterBrickClass(ImageBrick.self)\nregisterBrickClass(LabelBrick.self)\n\nlet imageURL = NSURL(string:\"https://secure.img2.wfrcdn.com/lf/8/hash/2664/10628031/1/custom_image.jpg\")!\n\nlet section = BrickSection(\"RootSection\", bricks: [\n    LabelBrick(text: \"Below is an image brick with fixed height\"),\n    ImageBrick(height: .fixed(size: 50)dataSource: ImageURLBrickModel(url: imageURL, contentMode: .ScaleAspectFit)),\n    LabelBrick(text: \"Below is an image brick loaded dynamically\"),\n    ImageBrick(height: .auto(estimate: .fixed(size: 50)), dataSource: ImageURLBrickModel(url: imageURL, contentMode: .ScaleAspectFit)),\n    LabelBrick(text: \"Below is an image brick with fixed height\"),\n    ImageBrick(height: .fixed(size: 50), dataSource: ImageURLBrickModel(url: imageURL, contentMode: .scaleAspectFill)),\n    ], inset: 10)\n\nself.setSection(section)\n\n```\n\n![images](Docs/Gif/images.gif)\n\n## Advanced Sticky\n```swift\n...\nbehavior = StickyLayoutBehavior(dataSource: self)\n...\n\nfunc stickyLayoutBehavior(stickyLayoutBehavior: StickyLayoutBehavior, shouldStickItemAtIndexPath indexPath: NSIndexPath, withIdentifier identifier: String, inCollectionViewLayout collectionViewLayout: UICollectionViewLayout) -\u003e Bool {\n    return identifier == BrickIdentifiers.titleLabel\n}\n\n```\n![sticky](Docs/Gif/sticky.gif)\n\n## Coverflow\n\n```swift\n\nlayout.scrollDirection = .horizontal\n\nlet snapToBehavior = SnapToPointLayoutBehavior(scrollDirection: .horizontal(.Center))\nself.brickCollectionView.layout.behaviors.insert(snapToBehavior)\nself.brickCollectionView.layout.behaviors.insert(CoverFlowLayoutBehavior(minimumScaleFactor: 0.75))\n\n```\n\n![coverflow](Docs/Gif/coverflow.gif)\n\n## Appear Behavior (none, bottom, top)\n\n```swift\nlayout.appearBehavior = BrickAppearTopBehavior() // Insert from the top\nlayout.appearBehavior = BrickAppearBottomBehavior() // Insert from the bottom\n\n```\n![insert](Docs/Gif/insert.gif)\n\n## Spotlight\n\n```swift\n...\nbehavior = SpotlightLayoutBehavior(dataSource: self)\n...\n\nfunc spotlightLayoutBehavior(behavior: SpotlightLayoutBehavior, smallHeightForItemAtIndexPath indexPath: NSIndexPath, withIdentifier identifier: String, inCollectionViewLayout collectionViewLayout: UICollectionViewLayout) -\u003e CGFloat? {\n    return identifier == BrickIdentifiers.repeatLabel ? 50 : nil\n}\n\n```\n\n![spotlight](Docs/Gif/spotlight.gif)\n\n## Features\n- Setup is simple, can create a view with a few lines of code.\n- Is an alternative implementation of a UICollectionViewController.\n- Advanced Width and Height setups, views can be sized according to iPad/screen size upon initialization!\n- Allows for the reuse of cells.\n  - Supports multiple nibs per BrickCell: UICollectionViewCell class.\n- Has \"behaviors\", which are complex layout interactions that can be applied to any view controller.\n  - Sticky Headers/Footers\n  - Hide Views\n  - Scrolling Behaviors\n  - Snap to Point\n  - These are all supported by ten lines or less of code!\n- Asynchronous changing of height\n  - Allows content to flow in after the cell is already on screen.\n  - Supports the height of cells to resize after an image or video has loaded.\n\n## Installation Instructions\nInstallation is simple.  You just need Cocoapods and it is a matter of adding this to your podfile:\n```ruby\npod 'BrickKit'\n```\n\nSee [Installation Details](#Installation Details)\n\n## Terminology\n\n### Brick\nThe `Brick` object represents the **model** of what needs to be laid out on screen. E.g. in case of a `LabelBrick`, the model should contain the text that should go inside the label.\n\n\u003e We strongly encourage that every `Brick` has a `datasource` and an optional `delegate`. This is a pattern that proves to be successful and allows your brick to be repeated.\n\u003e For simple bricks, it is suggested to create a basic BrickModel that subclasses that datasource, so that you do not have to implement the datasource in the viewcontroller.\n\u003e For a number of examples on how to implement Bricks, refer to the examples in the BrickKit pod, such as `LabelBrick` or `ButtonBrick`.\n\n### BrickSection\nThe `BrickSection` provides information for the BrickCollectionView on how to lay out the cells on screen.  In particular, it provides the `identifiers`,\nthe bricks inside of the BrickSection, as well as `UIEdgeInsets` and an `inset`.\n\n\u003e A `BrickSection` is a subclass of a Brick.  This provides for nesting of multiple BrickSections inside of a BrickSection.  The BrickCollectionView will only accept a single, unified\n\u003e BrickSection, so if you want complex layouts you will want to nest BrickSections together.\n\n### BrickCell\nThe `BrickCell` object is representing the actual **view**. The cell will be instantiated when the view comes on screen and will call its dataSource to obtain information on how to\ndisplay itself.\n\n\u003e As BrickKit is based on `UICollectionView`, every `BrickCell` is a subclass of `UICollectionViewCell`.\n\n### BrickCollectionView\nA BrickCollectionView, a subclass of `UICollectionView`, manages the brick section/sections. It is also responsible for loading the correct `BrickCell` for a given brick.\n\n\u003e You'll need to register every brick that is used in the BrickCollectionView. (`brickCollectionView.registerBrickClass(LabelBrick.self)`)\n\u003e If you fail to do so, the app will crash (with a descriptive message)\n\u003e Note, a CollectionBrick is a brick that houses a BrickCollectionView.  If you implement one of these, you will have to register the brickClass in the CollectionBrick's BrickCollectionView or you will crash with a nib not found error.\n\n### BrickLayout\nAn object that implements the `BrickLayout` protocol is responsible for the displaying of the BrickCells on the BrickCollectionView.\n\n### BrickFlowLayout\nA BrickFlowLayout is an implementation of the BrickLayout protocol.\n\n\u003e A BrickFlowLayout is a subclass of a UICollectionViewLayout.\n\n### BrickDimension\nA `BrickDimension` is something you provide upon the initialization of a brick.  This is where the magic happens.\nBrickDimensions allow for widths and heights to be based off of view size or a fixed value. Then can then also be dependent on your horizontal or vertical size class, your orientation, or you can\nsimply leave it as automatic and let auto layout do its thing.\n\n### BrickRepeatCountDataSource\nA `BrickRepeatCountDataSource` allows you to specify a repeat count for a certain brick.  This will give your `BrickCell` an index, similar to how arrays are setup.\n\n## Implementation Details\nIdeally, a Brick has an identifier. This identifier can be used to refer back to a certain Brick.\nThe advantage of this over using `NSIndexPath` is that it decouples the model from the layout.\nThis allows you to use the same brick, datasource, and delegate for a cell.\n\nBrickKit comes with some useful default brick implementations:\n\n- [LabelBrick](Docs/Bricks/LABEL_BRICK.md)\n- [ButtonBrick](Docs/Bricks/BUTTON_BRICK.md)\n- [ImageBrick](Docs/Bricks/IMAGE_BRICK.md)\n- [CollectionBrick](Docs/Bricks/COLLECTION_BRICK.md)\n\nThe root object used in BrickKit is a [BrickSection](Docs/BRICK_SECTION.md)\n\nThe following code will create a label that is:\n- The full width of the view.\n- Its height will dynamically resize based on the text that is inside of the label.\n- The above two conditions are dependent on the nib's constraints being setup correctly, without any specific heights or width set.\n\n```\n --------------------------------\n |         LABEL BRICK          |\n --------------------------------\n```\n\n```swift\nimport UIKit\nimport BrickKit\n\nclass ViewController: BrickViewController {\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n\n        let section = BrickSection(bricks: [\n            LabelBrick(text: \"LABEL BRICK\")\n            ])\n\n        self.setSection(section)\n    }\n}\n```\n\nBricks are sized using auto layout. If the constraints are setup to grow vertically, the brick will get the proper height as needed.\nSo in case of a label, when the text is larger than the width, it will use the next line.\n\n```\n --------------------------------\n | LABEL BRICK LABEL BRICK LABEL |\n |       BRICK LABEL BRICK       |\n --------------------------------\n```\n\n```swift\nlet section = BrickSection(bricks: [\n\tLabelBrick(text: \"LABEL BRICK LABEL BRICK LABEL BRICK LABEL BRICK\")\n])\n```\nTry it in the LabelBrickPlayground.\n\n### BrickDimension\nTo setup the dimensions of a brick, please refer to [BRICK_DIMENSION.md](Docs\\BRICK_DIMENSION.md).\n\n### BrickRepeatCountDataSource\nBrickRepeatCountDataSources are setup based off a section.  They can be set upon any `BrickSection`.\n\n```swift\nimport UIKit\nimport BrickKit\n\nclass ViewController: BrickViewController {\n\n\tvar fruits: [Fruit] = []\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n\n        fruits.append(Fruit(name: \"Apple\"))\n        fruits.append(Fruit(name: \"Banana\"))\n        fruits.append(Fruit(name: \"Cherry\"))\n\n        let section = BrickSection(bricks: [\n            LabelBrick(\"FRUIT\", text: \"BRICK 1\")\n        ])\n\n        section.repeatCountDataSource = self\n\n        self.setSection(section)\n    }\n\n}\n\nextension ViewController: BrickRepeatCountDataSource {\n\n    func repeatCount(for identifier: String, with collectionIndex: Int, collectionIdentifier: String) -\u003e Int {\n        return identifier == \"FRUIT\" ? fruits.count : 1\n    }\n}\n```\nTry it in the BrickRepeatCountPlayground.\n\n## Layout\n\n### HideBehavior\nThis behavior allows you to hide bricks and sections.\n\n### BrickAppearBehavior\nA behavior that defines the direction where bricks are appearing and disappearing from.\n\n\u003e  `BrickAppearBehavior ` is extendable, so you can create your own behavior\n\n### BrickLayoutZIndexBehavior\nA behavior that determines how the bricks are laid out on the z-Axis. This is very important when dealing with behaviors that allow intersections between bricks\n\n|  Behavior  |    Description    |\n|------------|:-----------------:|\n|   TopDown  |  The cell at the top has the highest zIndex. Ideal for layouts that need `Sticky` cells, where a `Brick` needs to be displayed above all other bricks.\n|  BottomUp  |  The cell at the bottom has the highest zIndex. Ideal for layouts where the lower cells are above the higher cells.\n\n\n\n## Behaviors\nA behavior changes the way a brick is displayed on screen. This can depend on scrolling, refreshing etc\n\nBrickKit comes with a few behaviors built in:\n\n| Behavior   |      Description  |\n|----------|:-------------:|\n| StickyLayoutBehavior |  Allows bricks and sections to `stick` to the top of the screen. The brick will stick until its containing section is passed.\n| MinimumStickyLayoutBehavior |  Same as the `StickyLayoutBehavior`, but the height of the brick will first shrink to a minimum value before it starts sticking.\n| StickyFooterLayoutBehavior |  Allows bricks and sections to `stick` to the bottom of the screen. The brick will stick until its containing section is passed.\n| OnScrollDownStickyLayoutBehavior |  Same as the `StickyLayoutBehavior`, but the bricks will only stick when scrolling back up. When scrolling down, the brick will just flow with the other bricks.\n| SnapToPointLayoutBehavior |  After scrolling, this behavior will snap your ScrollView to a given location. This is useful if you want bricks to snap to a point after the user is done scrolling.\n| SpotlightLayoutBehavior | While scrolling, the brick 'in the spotlight' will grow.  Only one brick is in the spotlight at a time.\n| CardLayoutBehavior |  The bricks will scroll like a stack of cards.  The ScrollView will not scroll until one card is completely on top of the other.\n| CoverFlowLayoutBehavior |  While scrolling, the brick closest to the center of the screen will grow bigger while the other bricks will shrink.\n| OffsetLayoutBehavior |  Allows an offset to the origin or size of bricks.\n| MaxZIndexLayoutBehavior |  Allows a brick to be set to the maxZIndex, which means they will always be on top of any other brick.\n| SetZIndexLayoutBehavior |  Allows the layout to set the ZIndex of any brick to any value.\n\n\u003e `BrickLayoutBehavior` is extendable, so are free to create your own behaviors.\n\n\n## Requirements\n\n- iOS 9.1+ / tvOS 9.0+\n- Xcode 8.0+\n- Swift 3.0 (Swift 3.2 compatible)\n\n## Communication\n\n- If you **found a bug**, open an issue.\n- If you **have a feature request**, open an issue.\n- If you **want to contribute**, submit a pull request.\n\n## Installation Details\n\n### CocoaPods\n\n[CocoaPods](http://cocoapods.org) is a dependency manager for Cocoa projects. You can install it with the following command:\n\n```bash\n$ gem install cocoapods\n```\n\n\nTo integrate BrickKit into your Xcode project using CocoaPods, specify it in your `Podfile`:\n\n```ruby\nsource 'https://github.com/CocoaPods/Specs.git'\nplatform :ios, '10.0'\nuse_frameworks!\n\ntarget '\u003cYour Target Name\u003e' do\n    pod 'BrickKit'\nend\n```\n\nThen, run the following command:\n\n```bash\n$ pod install\n```\n\n### Carthage\n\n[Carthage](https://github.com/Carthage/Carthage) is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks.\n\nYou can install Carthage with [Homebrew](http://brew.sh/) using the following command:\n\n```bash\n$ brew update\n$ brew install carthage\n```\n\nTo integrate BrickKit into your Xcode project using Carthage, specify it in your `Cartfile`:\n\n```ogdl\ngithub \"wayfair/brickkit-ios\"\n```\n\nRun `carthage update` to build the framework and drag the built `BrickKit.framework` into your Xcode project.\n\n## Credits\n\nBrickKit is owned and maintained by [Wayfair](https://www.wayfair.com).\n\n## Code of Conduct\n\nSee [CODE\\_OF_CONDUCT.md](CODE_OF_CONDUCT.md).\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md).\n\n\n## License\n\nBrickKit is released under the Apache license. See LICENSE for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwayfair-archive%2Fbrickkit-ios","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwayfair-archive%2Fbrickkit-ios","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwayfair-archive%2Fbrickkit-ios/lists"}