[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-6789":3},{"id":4,"name":5,"fullName":6,"owner":5,"repo":5,"description":7,"homepage":8,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":15,"stars7d":15,"stars30d":16,"stars90d":15,"forks30d":15,"starsTrendScore":15,"compositeScore":17,"rankGlobal":9,"rankLanguage":9,"license":18,"archived":19,"fork":19,"defaultBranch":20,"hasWiki":19,"hasPages":21,"topics":22,"createdAt":9,"pushedAt":9,"updatedAt":31,"readmeContent":32,"aiSummary":33,"trendingCount":15,"starSnapshotCount":15,"syncStatus":34,"lastSyncTime":35,"discoverSource":36},6789,"SwipeCellKit","SwipeCellKit\u002FSwipeCellKit","Swipeable UITableViewCell\u002FUICollectionViewCell based on the stock Mail.app, implemented in Swift.","https:\u002F\u002Fjerkoch.com\u002F2017\u002F02\u002F07\u002Fswiper-no-swiping.html",null,"Swift",6290,812,67,60,0,6,39.73,"Other",false,"develop",true,[23,24,25,26,27,28,29,30],"drag","ios","swift","swipe","tableview","uikit","uitableview","uitableviewcell","2026-06-12 02:01:30","# SwipeCellKit\n\n[![Build Status](https:\u002F\u002Ftravis-ci.org\u002Fjerkoch\u002FSwipeCellKit.svg)](https:\u002F\u002Ftravis-ci.org\u002Fjerkoch\u002FSwipeCellKit) \n[![Version Status](https:\u002F\u002Fimg.shields.io\u002Fcocoapods\u002Fv\u002FSwipeCellKit.svg)][podLink] \n[![Swift 5.0](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FSwift-5.0-orange.svg?style=flat)](https:\u002F\u002Fdeveloper.apple.com\u002Fswift\u002F)\n[![license MIT](https:\u002F\u002Fimg.shields.io\u002Fcocoapods\u002Fl\u002FSwipeCellKit.svg)][mitLink] \n[![Platform](https:\u002F\u002Fimg.shields.io\u002Fcocoapods\u002Fp\u002FSwipeCellKit.svg)][docsLink] \n[![Carthage compatible](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FCarthage-compatible-4BC51D.svg?style=flat)](https:\u002F\u002Fgithub.com\u002FCarthage\u002FCarthage)\n[![Twitter](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Ftwitter-@mkurabi-blue.svg?style=flat)](https:\u002F\u002Ftwitter.com\u002Fmkurabi)\n\n*Swipeable UITableViewCell\u002FUICollectionViewCell based on the stock Mail.app, implemented in Swift.*\n\n\u003Cp align=\"center\">\u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002Fjerkoch\u002FSwipeCellKit\u002Fdevelop\u002FScreenshots\u002FHero.gif\" \u002F>\u003C\u002Fp>\n\n## About\n\nA swipeable `UITableViewCell` or `UICollectionViewCell` with support for:\n\n* Left and right swipe actions\n* Action buttons with: *text only, text + image, image only*\n* Haptic Feedback\n* Customizable transitions: *Border, Drag, and Reveal*\n* Customizable action button behavior during swipe\n* Animated expansion when dragging past threshold\n* Customizable expansion animations\n* Support for both `UITableView` and `UICollectionView`\n* Accessibility\n* Dark Mode\n\n## Background\n\nCheck out my [blog post](https:\u002F\u002Fjerkoch.com\u002F2017\u002F02\u002F07\u002Fswiper-no-swiping.html) on how *SwipeCellKit* came to be.\n\n## Demo\n\n### Transition Styles\n\nThe transition style describes how the action buttons are exposed during the swipe.\n\n#### Border \n\n\u003Cp align=\"center\">\u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002Fjerkoch\u002FSwipeCellKit\u002Fdevelop\u002FScreenshots\u002FTransition-Border.gif\" \u002F>\u003C\u002Fp>\n\n#### Drag \n\n\u003Cp align=\"center\">\u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002Fjerkoch\u002FSwipeCellKit\u002Fdevelop\u002FScreenshots\u002FTransition-Drag.gif\" \u002F>\u003C\u002Fp>\n\n#### Reveal \n\n\u003Cp align=\"center\">\u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002Fjerkoch\u002FSwipeCellKit\u002Fdevelop\u002FScreenshots\u002FTransition-Reveal.gif\" \u002F>\u003C\u002Fp>\n\n#### Customized\n\n\u003Cp align=\"center\">\u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002Fjerkoch\u002FSwipeCellKit\u002Fdevelop\u002FScreenshots\u002FTransition-Delegate.gif\" \u002F>\u003C\u002Fp>\n\n### Expansion Styles\n\nThe expansion style describes the behavior when the cell is swiped past a defined threshold.\n\n#### None\n\n\u003Cp align=\"center\">\u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002Fjerkoch\u002FSwipeCellKit\u002Fdevelop\u002FScreenshots\u002FExpansion-None.gif\" \u002F>\u003C\u002Fp>\n\n#### Selection\n\n\u003Cp align=\"center\">\u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002Fjerkoch\u002FSwipeCellKit\u002Fdevelop\u002FScreenshots\u002FExpansion-Selection.gif\" \u002F>\u003C\u002Fp>\n\n#### Destructive\n\n\u003Cp align=\"center\">\u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002Fjerkoch\u002FSwipeCellKit\u002Fdevelop\u002FScreenshots\u002FExpansion-Destructive.gif\" \u002F>\u003C\u002Fp>\n\n#### Customized\n\n\u003Cp align=\"center\">\u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002Fjerkoch\u002FSwipeCellKit\u002Fdevelop\u002FScreenshots\u002FExpansion-Delegate.gif\" \u002F>\u003C\u002Fp>\n\n## Requirements\n\n* Swift 5.0\n* Xcode 10.3+\n* iOS 9.0+\n\n## Installation\n\n#### [CocoaPods](http:\u002F\u002Fcocoapods.org) (recommended)\n\n````ruby\nuse_frameworks!\n\n# Latest release in CocoaPods\npod 'SwipeCellKit'\n\n# Get the latest on develop\npod 'SwipeCellKit', :git => 'https:\u002F\u002Fgithub.com\u002FSwipeCellKit\u002FSwipeCellKit.git', :branch => 'develop'\n\n# If you have NOT upgraded to Xcode 11, use the last Swift Xcode 10.X compatible release\npod 'SwipeCellKit', '2.6.0'\n\n# If you have NOT upgraded to Swift 5.0, use the last Swift 4.2\u002FXcode 10.2 compatible release\npod 'SwipeCellKit', '2.5.4'\n\n# If you have NOT upgraded to Swift 4.2, use the last non-swift 4.2 compatible release\npod 'SwipeCellKit', '2.4.3'\n````\n\n#### [Carthage](https:\u002F\u002Fgithub.com\u002FCarthage\u002FCarthage)\n\n````bash\ngithub \"SwipeCellKit\u002FSwipeCellKit\"\n````\n\n#### [Swift Package Manager](https:\u002F\u002Fswift.org\u002Fpackage-manager\u002F)\n\n```swift\ndependencies: [\n    .package(url: \"https:\u002F\u002Fgithub.com\u002FSwipeCellKit\u002FSwipeCellKit\", from: \"2.7.1\")\n]\n```\n\n## Documentation\n\nRead the [docs][docsLink]. Generated with [jazzy](https:\u002F\u002Fgithub.com\u002Frealm\u002Fjazzy). Hosted by [GitHub Pages](https:\u002F\u002Fpages.github.com).\n\n## Usage for UITableView\n\nSet the `delegate` property on `SwipeTableViewCell`:\n\n````swift\noverride func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {\n    let cell = tableView.dequeueReusableCell(withIdentifier: \"Cell\") as! SwipeTableViewCell\n    cell.delegate = self\n    return cell\n}\n````\n\nAdopt the `SwipeTableViewCellDelegate` protocol:\n\n````swift\nfunc tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath, for orientation: SwipeActionsOrientation) -> [SwipeAction]? {\n    guard orientation == .right else { return nil }\n\n    let deleteAction = SwipeAction(style: .destructive, title: \"Delete\") { action, indexPath in\n        \u002F\u002F handle action by updating model with deletion\n    }\n\n    \u002F\u002F customize the action appearance\n    deleteAction.image = UIImage(named: \"delete\")\n\n    return [deleteAction]\n}\n````\n\nOptionally, you can implement the `editActionsOptionsForRowAt` method to customize the behavior of the swipe actions:\n\n````swift    \nfunc tableView(_ tableView: UITableView, editActionsOptionsForRowAt indexPath: IndexPath, for orientation: SwipeActionsOrientation) -> SwipeOptions {\n    var options = SwipeOptions()\n    options.expansionStyle = .destructive\n    options.transitionStyle = .border\n    return options\n}\n````\n## Usage for UICollectionView\n\nSet the `delegate` property on `SwipeCollectionViewCell`:\n\n````swift\noverride func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {\n    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: \"Cell\", for: indexPath) as! SwipeCollectionViewCell\n    cell.delegate = self\n    return cell\n}\n````\n\nAdopt the `SwipeCollectionViewCellDelegate` protocol:\n\n````swift\nfunc collectionView(_ collectionView: UICollectionView, editActionsForItemAt indexPath: IndexPath, for orientation: SwipeActionsOrientation) -> [SwipeAction]? {\n    guard orientation == .right else { return nil }\n\n    let deleteAction = SwipeAction(style: .destructive, title: \"Delete\") { action, indexPath in\n        \u002F\u002F handle action by updating model with deletion\n    }\n\n    \u002F\u002F customize the action appearance\n    deleteAction.image = UIImage(named: \"delete\")\n\n    return [deleteAction]\n}\n````\n\nOptionally, you can implement the `editActionsOptionsForItemAt` method to customize the behavior of the swipe actions:\n\n````swift    \nfunc collectionView(_ collectionView: UICollectionView, editActionsOptionsForItemAt indexPath: IndexPath, for orientation: SwipeActionsOrientation) -> SwipeOptions {\n    var options = SwipeOptions()\n    options.expansionStyle = .destructive\n    options.transitionStyle = .border\n    return options\n}\n````\n### Transitions\n\nThree built-in transition styles are provided by `SwipeTransitionStyle`:  \n\n* .border: The visible action area is equally divide between all action buttons.\n* .drag: The visible action area is dragged, pinned to the cell, with each action button fully sized as it is exposed.\n* .reveal: The visible action area sits behind the cell, pinned to the edge of the table view, and is revealed as the cell is dragged aside.\n\nSee [Customizing Transitions](https:\u002F\u002Fgithub.com\u002FSwipeCellKit\u002FSwipeCellKit\u002Fblob\u002Fdevelop\u002FGuides\u002FAdvanced.md) for more details on customizing button appearance as the swipe is performed.\n\n#### Transition Delegate\n\nTransition for a `SwipeAction` can be observered by setting a `SwipeActionTransitioning` on the `transitionDelegate` property. This allows you to observe what percentage is visible and access to the underlying `UIButton` for that `SwipeAction`. \n\n### Expansion\n\nFour built-in expansion styles are provided by `SwipeExpansionStyle`:  \n\n* .selection\n* .destructive (like Mail.app)\n* .destructiveAfterFill (like Mailbox\u002FTweetbot)\n* .fill\n\nMuch effort has gone into making `SwipeExpansionStyle` extremely customizable. If these built-in styles do not meet your needs, see [Customizing Expansion](https:\u002F\u002Fgithub.com\u002FSwipeCellKit\u002FSwipeCellKit\u002Fblob\u002Fdevelop\u002FGuides\u002FAdvanced.md) for more details on creating custom styles.\n\nThe built-in `.fill` expansion style requires manual action fulfillment. This means your action handler must call `SwipeAction.fulfill(style:)` at some point during or after invocation to resolve the fill expansion. The supplied `ExpansionFulfillmentStyle` allows you to delete or reset the cell at some later point (possibly after further user interaction).\n\nThe built-in `.destructive`, and `.destructiveAfterFill` expansion styles are configured to automatically perform row deletion when the action handler is invoked (automatic fulfillment).  Your deletion behavior may require coordination with other row animations (eg. inside `beginUpdates` and `endUpdates`). In this case, you can easily create a custom `SwipeExpansionStyle` which requires manual fulfillment to trigger deletion:\n\n````swift\nvar options = SwipeTableOptions()\noptions.expansionStyle = .destructive(automaticallyDelete: false)\n````\n\n> **NOTE**: You must call `SwipeAction.fulfill(with style:)` at some point while\u002Fafter your action handler is invoked to trigger deletion. Do not call `deleteRows` directly.\n\n````swift\nlet delete = SwipeAction(style: .destructive, title: nil) { action, indexPath in\n    \u002F\u002F Update model\n    self.emails.remove(at: indexPath.row)\n    action.fulfill(with: .delete)\n}\n````\n\n## Advanced \n\nSee the [Advanced Guide](https:\u002F\u002Fgithub.com\u002FSwipeCellKit\u002FSwipeCellKit\u002Fblob\u002Fdevelop\u002FGuides\u002FAdvanced.md) for more details on customization.\n\n## Credits\n\nMaintained by [**@mkurabi**](https:\u002F\u002Ftwitter.com\u002Fmkurabi).\n\n## Showcase\n\nWe're interested in knowing [who's using *SwipeCellKit*](https:\u002F\u002Fgithub.com\u002FSwipeCellKit\u002FSwipeCellKit\u002Fblob\u002Fdevelop\u002FSHOWCASE.md) in their app. Please submit a pull request to add your app! \n\n## License\n\n`SwipeCellKit` is released under an [MIT License][mitLink]. See `LICENSE` for details.\n\n*Please provide attribution, it is greatly appreciated.*\n\n[podLink]:https:\u002F\u002Fcocoapods.org\u002Fpods\u002FSwipeCellKit\n[docsLink]:https:\u002F\u002Fswipecellkit.github.io\u002FSwipeCellKit\u002F\n[mitLink]:http:\u002F\u002Fopensource.org\u002Flicenses\u002FMIT\n","SwipeCellKit 是一个基于 Swift 实现的可滑动 `UITableViewCell` 和 `UICollectionViewCell` 库，灵感来源于 iOS 系统自带的邮件应用。其核心功能包括支持左右滑动操作、多种样式的动作按钮（纯文本、文本+图片、仅图片）、触觉反馈以及自定义过渡效果等。此外，它还提供了高度可定制的动作按钮行为和扩展动画，并且全面支持 `UITableView` 和 `UICollectionView`，同时兼容深色模式与无障碍特性。该项目适用于需要为 iOS 应用添加类似邮件应用中滑动删除或标记功能的开发者，尤其适合追求用户界面交互体验优化的应用场景。",2,"2026-06-11 03:08:55","top_language"]