{"id":20115552,"url":"https://github.com/mutualmobile/mmspreadsheetview","last_synced_at":"2025-05-12T14:30:18.478Z","repository":{"id":10846579,"uuid":"13127804","full_name":"mutualmobile/MMSpreadsheetView","owner":"mutualmobile","description":null,"archived":false,"fork":false,"pushed_at":"2020-12-07T12:25:55.000Z","size":201,"stargazers_count":193,"open_issues_count":11,"forks_count":34,"subscribers_count":18,"default_branch":"master","last_synced_at":"2024-04-14T18:05:11.559Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Objective-C","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/mutualmobile.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":"2013-09-26T16:23:59.000Z","updated_at":"2024-01-15T01:45:56.000Z","dependencies_parsed_at":"2022-08-29T15:01:30.804Z","dependency_job_id":null,"html_url":"https://github.com/mutualmobile/MMSpreadsheetView","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mutualmobile%2FMMSpreadsheetView","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mutualmobile%2FMMSpreadsheetView/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mutualmobile%2FMMSpreadsheetView/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mutualmobile%2FMMSpreadsheetView/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mutualmobile","download_url":"https://codeload.github.com/mutualmobile/MMSpreadsheetView/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":236664629,"owners_count":19185531,"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":[],"created_at":"2024-11-13T18:35:37.785Z","updated_at":"2025-02-10T05:08:18.338Z","avatar_url":"https://github.com/mutualmobile.png","language":"Objective-C","funding_links":[],"categories":[],"sub_categories":[],"readme":"#Mutual Mobile Spreadsheet View\n`MMSpreadsheetView` is a configurable spreadsheet-like view. Depending on the initial header row or column configuration, up to four collection views will be coordinated to provide the user interface. Although originally designed for use on iPad in full-screen, it scales down well for use in smaller views.\n\n\u003cp align=\"center\" \u003e\n\u003cimg src=\"http://mutualmobile.github.io/MMSpreadsheetView/ExampleImages/Example.png\"/\u003e\n\u003c/p\u003e\n\n---\n\n##Documentation\nOfficial appledoc documentation can be found at [CocoaDocs](http://cocoadocs.org/docsets/MMSpreadsheetView/).\n\n---\n\n##Installing MMSpreadsheetView\n[![Badge w/ Version](https://cocoapod-badges.herokuapp.com/v/MMSpreadsheetView/badge.png)](https://cocoadocs.org/docsets/MMSpreadsheetView)\n[![Badge w/ Platform](https://cocoapod-badges.herokuapp.com/p/MMSpreadsheetView/badge.svg)](https://cocoadocs.org/docsets/MMSpreadsheetView)\nYou can install MMSpreadsheetView in your project by using [CocoaPods](https://github.com/cocoapods/cocoapods):\n\n```Ruby\npod 'MMSpreadsheetView', '~\u003e 0.0.3'\n```\n\n---\n\n##Initializing a Spreadsheet View\nThe designated initializer for `MMSpreadsheetView` requires passing in the number of header rows and columns as well as the initial bounds rect. Register the cell classes you will be using and set the delegate and dataSource. Finally, add the view as a subview.\n\n```Objective-C\n// Create the spreadsheet in code.\nMMSpreadsheetView *spreadSheetView = [[MMSpreadsheetView alloc] initWithNumberOfHeaderRows:1 numberOfHeaderColumns:1 frame:self.view.bounds];\n\n// Register your cell classes.\n[spreadSheetView registerCellClass:[MMGridCell class] forCellWithReuseIdentifier:@\"GridCell\"];\n[spreadSheetView registerCellClass:[MMTopRowCell class] forCellWithReuseIdentifier:@\"TopRowCell\"];\n[spreadSheetView registerCellClass:[MMLeftColumnCell class] forCellWithReuseIdentifier:@\"LeftColumnCell\"];\n\n// Set the delegate \u0026 datasource spreadsheet view.\nspreadSheetView.delegate = self;\nspreadSheetView.dataSource = self;\n\n// Add the spreadsheet view as a subview.\n[self.view addSubview:spreadSheetView];\nself.spreadSheetView = spreadSheetView;\n```\n\n---\n\n##Caveats\n\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003ePerformance\u003c/strong\u003e: As the number of cells shown increases, scrolling performance declines. A large grid (1000x1000) takes a long time to initialize, but if the cell sizes are large enough (150x150) or greater, scrolling performance is not affected. However, a small grid (50x50) of (20x20) cells basically doesn't scroll.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eNSIndexPath convenience category\u003c/strong\u003e: The library includes a convenience category for NSIndexPath to reduce confusion. The additions of indexPath.mmSpreadsheetRow and indexPath.mmSpreadsheetColumn represent their respective elements.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCollectionView pass-through methods\u003c/strong\u003e: The following methods provide support for copy/paste actions on cells. All three should be implemented if any are.\n\u003col\u003e\n\u003cli\u003espreadsheetView:shouldShowMenuForItemAtIndexPath:\u003c/li\u003e\n\u003cli\u003espreadsheetView:canPerformAction:forItemAtIndexPath:withSender:\u003c/li\u003e\n\u003cli\u003espreadsheetView:performAction:forItemAtIndexPath:withSender:\u003cbr /\u003e\u003cbr /\u003e\u003c/li\u003e\n\u003c/ol\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eUnintended gesture handling\u003c/strong\u003e: MMSpreadsheetView hooks into the collection view pan gesture recognizers to implement \"exclusive touch,\" which disables tap registration on other sections of the grid until the first touch ends. Also, touches are disabled when the view is in a bounce to prevent locking the view in an awkward state.\u003c/li\u003e\n\u003c/ul\u003e\n\n---\n\n##Credit\nDesigned and Developed by these fine folks at [Mutual Mobile](http://mutualmobile.com):\n\n###Development\n\n* [Jeff Lacey](http://twitter.com/canispater)\n* [Kevin Harwood](http://twitter.com/kevinharwood)\n\n---\n\n##Feedback\nWe'd love to hear feedback on the library. Create Github issues, or hit us up on Twitter.\n\n---\n\n##License ![License MIT](https://go-shields.herokuapp.com/license-MIT-blue.png)\n`MMSpreadsheetView` is available under the MIT license. See the LICENSE file for more info.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmutualmobile%2Fmmspreadsheetview","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmutualmobile%2Fmmspreadsheetview","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmutualmobile%2Fmmspreadsheetview/lists"}