{"id":25219949,"url":"https://github.com/zuopanyao/elegantsnap","last_synced_at":"2026-05-09T06:35:38.760Z","repository":{"id":56909905,"uuid":"231239272","full_name":"ZuopanYao/ElegantSnap","owner":"ZuopanYao","description":"ElegantSnap(Base on SnapKit) to make Auto Layout easy and elegant on both iOS and OS X.","archived":false,"fork":false,"pushed_at":"2021-06-24T05:36:29.000Z","size":1559,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-02-10T21:49:42.668Z","etag":null,"topics":["apple","autolayout","carthage","cocoapods","ios","ios-tvos-macos","macos","snapkit","swift","tvos"],"latest_commit_sha":null,"homepage":"https://www.yaozuopan.top","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ZuopanYao.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-01-01T16:36:04.000Z","updated_at":"2022-03-31T10:14:35.000Z","dependencies_parsed_at":"2022-08-20T19:50:34.687Z","dependency_job_id":null,"html_url":"https://github.com/ZuopanYao/ElegantSnap","commit_stats":null,"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ZuopanYao%2FElegantSnap","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ZuopanYao%2FElegantSnap/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ZuopanYao%2FElegantSnap/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ZuopanYao%2FElegantSnap/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ZuopanYao","download_url":"https://codeload.github.com/ZuopanYao/ElegantSnap/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247325687,"owners_count":20920715,"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":["apple","autolayout","carthage","cocoapods","ios","ios-tvos-macos","macos","snapkit","swift","tvos"],"created_at":"2025-02-10T21:49:42.611Z","updated_at":"2026-05-09T06:35:38.660Z","avatar_url":"https://github.com/ZuopanYao.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ElegantSnap\n\n基于SnapKit, 用法简洁优雅,可运行在iOS、tvOS、macOS上自动布局库，支持链式调用\n\nElegantSnap(Base on SnapKit) to make Auto Layout easy and elegant on both iOS and OS X.\n\n\n[![Platform](https://img.shields.io/cocoapods/p/ElegantSnap.svg?style=flat)](https://github.com/ZuopanYao/ElegantSnap)\n[![Cocoapods Compatible](https://img.shields.io/cocoapods/v/ElegantSnap.svg)](https://cocoapods.org/pods/ElegantSnap)\n[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)\n\n## Requirements / 使用条件\n\n- iOS 10.0+ / Mac OS X 10.12+ / tvOS 10.0+\n- Xcode 10.2+\n- Swift 5.0+\n\n\n## Installation / 安装\n\n### CocoaPods\n\n```\npod 'ElegantSnap'\n```\n\n### Carthage\n\n```\ngithub \"ZuopanYao/ElegantSnap\" \n```\n\n### Manually / 手动安装\n\nIf you prefer not to use either of the aforementioned dependency managers, you can integrate SnapKit into your project manually.\n\n如果您不喜欢以上管理依赖库的方式，则可以手动将 ElegantSnap 集成到项目中。\n\n\n## Usage / 使用\n\n### Compare with SnapKit / 与 SnapKit 比较\n\n| ElegantSnap | SnapKit |\n|:------|:----|\n|aView.make([.top()])\u003cbr\u003e // aView.make([.top(nil, nil)])\u003cbr\u003e // aView.make([.top(nil)])|aView.snp.makeConstraints { (make) in\u003cbr/\u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;make.top.equalToSuperview()\u003cbr/\u003e }|\n|aView.make([.top(20)])\u003cbr\u003e // aView.make([.top(nil, 20)])\u003cbr\u003e|aView.snp.makeConstraints { (make) in\u003cbr/\u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;make.top.equalToSuperview().offset(20)\u003cbr/\u003e }|\n|aView.make([.top(base.snp.bottom)])\u003cbr\u003e // aView.make([.top(base.snp.bottom, nil)])\u003cbr\u003e|aView.snp.makeConstraints { (make) in\u003cbr/\u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;make.top.equalTo(base.snp.bottom)\u003cbr/\u003e }|\n|aView.make([.top(base.snp.bottom, 20)])|aView.snp.makeConstraints { (make) in\u003cbr/\u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;make.top.equalTo(base.snp.bottom).offset(20)\u003cbr/\u003e }|\n|...|...|\n|aView.make([.width()])\u003cbr\u003e // aView.make([.width(nil)])|aView.snp.makeConstraints { (make) in\u003cbr/\u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;make.top.equalToSuperview()\u003cbr/\u003e }|\n|aView.make([.width(200)])|aView.snp.makeConstraints { (make) in\u003cbr/\u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;make.width.equalTo(200)\u003cbr/\u003e }|\n|aView.make([.width(base.snp.width)])|aView.snp.makeConstraints { (make) in\u003cbr/\u003e \u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;make.width.equalTo(base.snp.width)\u003cbr/\u003e }|\n|...|...|\n\n\n### Quick Start / 快速上手\n\n#### Example 1 / 示例 1\n\n```swift\nimport ElegantSnap\n\nclass ViewController: NSViewController {\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        let aView = NSView()\n        view.addSubview(aView, constraints: [.top(), .leading(), .width(200), .height(400)])\n        \n        // OR Chain 链式使用\n        // v1.5.0+\n        // view.addSubview(aView) { $0.top().leading().width(200).height(400).end() }\n        \n        // view.addSubview(aView)\n        // aView.make([.top(), .leading(), .width(200), .height(400)])\n         \n        // OR Chain 链式使用\n        // v1.5.0+\n         view.make { $0.top().leading().width(200).height(400).end() }\n    }\n}\n```\n\nequal to / 等同于\n\n```swift\nimport SnapKit\n\nclass ViewController: NSViewController {\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        let aView = NSView()\n        view.addSubview(aView)\n                \n        aView.snp.makeConstraints { (make) in\n            make.top.equalToSuperview()\n            make.leading.equalToSuperview()\n            make.width.equalTo(200)\n            make.height.equalTo(400)\n        }\n    }\n}\n```\n\n#### Example 2 / 示例 2\n\n```swift\nimport ElegantSnap\n\nclass ViewController: NSViewController {\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        let aView = NSView()\n        view.addSubview(aView, constraints: [.top(), .leading(), .width(200), .height(400)])\n        \n        // OR Chain 链式使用\n        // v1.5.0+\n        // view.addSubview(aView) { $0.top().leading().width(200).height(400).end() }\n        \n        let myView = NSView()\n        view.addSubview(myView, constraints: [.top(aView.snp.bottom, 20), .leading(), .width(300), .height(aView.snp.height)])\n        \n        // OR Chain 链式使用\n        // v1.5.0+\n        // view.addSubview(myView) { $0.top(aView.snp.bottom, 20).leading().width(300).height(aView.snp.height).end() }\n    }\n    \n}\n```\n\nequal to / 等同于\n\n```swift\nimport SnapKit\n\nclass ViewController: NSViewController {\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        let aView = NSView()\n        view.addSubview(aView)\n                \n        aView.snp.makeConstraints { (make) in\n            make.top.equalToSuperview()\n            make.leading.equalToSuperview()\n            make.width.equalTo(200)\n            make.height.equalTo(400)\n        }\n        \n        let myView = NSView()\n        view.addSubview(myView)\n        \n        myView.snp.makeConstraints { (make) in\n            make.top.equalTo(aView.snp.bottom).offset(20)\n            make.leading.equalToSuperview()\n            make.width.equalTo(300)\n            make.height.equalTo(aView.snp.height)\n        }\n    }\n}\n```\n\n### 多视图排列\n\n#### 多个View等宽水平排列\n\n```swift\nimport ElegantSnap\n\nclass ViewController: NSViewController {\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n                \n        let aView = NSView()\n        aView.wantsLayer = true\n        aView.layer?.backgroundColor = NSColor.red.cgColor\n        \n        let bView = NSView()\n        bView.wantsLayer = true\n        bView.layer?.backgroundColor = NSColor.blue.cgColor\n        \n        let cView = NSView()\n        cView.wantsLayer = true\n        cView.layer?.backgroundColor = NSColor.black.cgColor\n        \n        let dView = NSView()\n        dView.wantsLayer = true\n        dView.layer?.backgroundColor = NSColor.purple.cgColor\n        \n        view.addSubview([aView, bView, cView, dView],\n                        constraints: [.height(80), .top(20)], spacing: (10, -10, 20), direction: .horizontal)\n    }\n}\n\n```\n\n![horizontal](./horizontal.png)\n\n\n#### 多个View等高垂直排列\n\n```swift\nimport ElegantSnap\n\nclass ViewController: NSViewController {\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n                \n        let aView = NSView()\n        aView.wantsLayer = true\n        aView.layer?.backgroundColor = NSColor.red.cgColor\n        \n        let bView = NSView()\n        bView.wantsLayer = true\n        bView.layer?.backgroundColor = NSColor.blue.cgColor\n        \n        let cView = NSView()\n        cView.wantsLayer = true\n        cView.layer?.backgroundColor = NSColor.black.cgColor\n        \n        let dView = NSView()\n        dView.wantsLayer = true\n        dView.layer?.backgroundColor = NSColor.purple.cgColor\n        \n        view.addSubview([aView, bView, cView, dView],\n                        constraints: [.width(80), .leading(20)], spacing: (10, -10, 20), direction: .vertical)\n    }\n}\n\n```\n\n![vertical](./vertical.png)\n\n\n## License / 许可证\n\nElegantSnap is released under the MIT license. See LICENSE for details.\n\nElegantSnap 是在 MIT 许可下发布的，有关详情请查看该许可证。","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzuopanyao%2Felegantsnap","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzuopanyao%2Felegantsnap","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzuopanyao%2Felegantsnap/lists"}