{"id":13462669,"url":"https://github.com/pujiaxin33/JXSegmentedView","last_synced_at":"2025-03-25T05:32:12.803Z","repository":{"id":38325936,"uuid":"163158144","full_name":"pujiaxin33/JXSegmentedView","owner":"pujiaxin33","description":"A powerful and easy to use segmented view (segmentedcontrol, pagingview, pagerview, pagecontrol, categoryview) (腾讯新闻、今日头条、QQ音乐、网易云音乐、京东、爱奇艺、腾讯视频、淘宝、天猫、简书、微博等所有主流APP分类切换滚动视图)","archived":false,"fork":false,"pushed_at":"2024-07-10T08:02:53.000Z","size":10707,"stargazers_count":2709,"open_issues_count":34,"forks_count":373,"subscribers_count":37,"default_branch":"master","last_synced_at":"2024-10-29T12:28:55.639Z","etag":null,"topics":["category","categoryview","collectionview","indicator","page","pagecontrol","paging","pagingview","scrollview","segment","segmented","segmentedcontrol","segmentedview","split","swift","switch","uipagecontrol","uipageviewcontroller","uisplitviewcontroller"],"latest_commit_sha":null,"homepage":"","language":"Swift","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/pujiaxin33.png","metadata":{"files":{"readme":"README-English.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,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-12-26T08:49:51.000Z","updated_at":"2024-10-28T04:24:30.000Z","dependencies_parsed_at":"2022-07-14T20:30:39.833Z","dependency_job_id":"4e14f257-3a67-48f2-9b9a-da115a635ed8","html_url":"https://github.com/pujiaxin33/JXSegmentedView","commit_stats":{"total_commits":229,"total_committers":17,"mean_commits":"13.470588235294118","dds":"0.11353711790393017","last_synced_commit":"092245792cdfb476cbcb2880b28921340841cf59"},"previous_names":[],"tags_count":44,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pujiaxin33%2FJXSegmentedView","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pujiaxin33%2FJXSegmentedView/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pujiaxin33%2FJXSegmentedView/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pujiaxin33%2FJXSegmentedView/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pujiaxin33","download_url":"https://codeload.github.com/pujiaxin33/JXSegmentedView/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245025997,"owners_count":20549071,"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":["category","categoryview","collectionview","indicator","page","pagecontrol","paging","pagingview","scrollview","segment","segmented","segmentedcontrol","segmentedview","split","swift","switch","uipagecontrol","uipageviewcontroller","uisplitviewcontroller"],"created_at":"2024-07-31T13:00:18.556Z","updated_at":"2025-03-25T05:32:12.781Z","avatar_url":"https://github.com/pujiaxin33.png","language":"Swift","funding_links":[],"categories":["Swift","iOS","Content","uiscrollview nested uiscrollview"],"sub_categories":["PageView","Segment Control"],"readme":"\u003cdiv align=center\u003e\u003cimg src=\"Example/JXSegmentedViewExample/Image/JXSegmentedViewSmall.png\" width=\"467\" height=\"84\" /\u003e\u003c/div\u003e\n\n[![platform](https://img.shields.io/badge/platform-iOS-blue.svg?style=plastic)](#)\n[![languages](https://img.shields.io/badge/language-swift-blue.svg)](#) \n[![cocoapods](https://img.shields.io/badge/cocoapods-supported-4BC51D.svg?style=plastic)](https://cocoapods.org/pods/JXSegmentedView)\n[![support](https://img.shields.io/badge/support-ios%208%2B-orange.svg)](#) \n\nA powerful and easy to use segmented view (segmentedcontrol, pagingview, pagerview, pagecontrol, categoryview) \n\nAdvantages compared to other similar tripartite libraries:\n- Indicator logic use Protocol Oriented Programming, which can be easily to extension;\n- Provide more comprehensive and rich effects, and support almost all popular APP effects;\n- Use subclassing to manage cell styles, with clearer logic and simpler extensions;\n\n## Objective-C Version\n\nIf you are looking for the Objective-C version, please click to view\n[JXCategoryView](https://github.com/pujiaxin33/JXCategoryView)\n\n## Preview\n\n### Indicator Preview\n\nDescription | Gif |\n----|------|\nLine fixed width  |  \u003cimg src=\"https://github.com/pujiaxin33/JXExampleImages/blob/master/JXSegmentedView/Indicator/LineFixedWidth.gif\" width=\"350\" height=\"80\"\u003e |\nLine flexible width  |  \u003cimg src=\"https://github.com/pujiaxin33/JXExampleImages/blob/master/JXSegmentedView/Indicator/LineFlexibleWidth.gif\" width=\"350\" height=\"80\"\u003e |\nLine lengthen  |  \u003cimg src=\"https://github.com/pujiaxin33/JXExampleImages/blob/master/JXSegmentedView/Indicator/LineLengthen.gif\" width=\"350\" height=\"80\"\u003e |\nLine lengthen and offset  |  \u003cimg src=\"https://github.com/pujiaxin33/JXExampleImages/blob/master/JXSegmentedView/Indicator/LineLengthenOffset.gif\" width=\"350\" height=\"80\"\u003e |\nRainbowLine  |  \u003cimg src=\"https://github.com/pujiaxin33/JXExampleImages/blob/master/JXSegmentedView/Indicator/LineRainbow.gif\" width=\"350\" height=\"80\"\u003e |\nDotLine |  \u003cimg src=\"https://github.com/pujiaxin33/JXExampleImages/blob/master/JXSegmentedView/Indicator/LineDot.gif\" width=\"334\" height=\"80\"\u003e |\nDoubleLine  |  \u003cimg src=\"https://github.com/pujiaxin33/JXExampleImages/blob/master/JXSegmentedView/Indicator/LineDouble.gif\" width=\"350\" height=\"80\"\u003e |\nTriangle bottom  |  \u003cimg src=\"https://github.com/pujiaxin33/JXExampleImages/blob/master/JXSegmentedView/Indicator/Triangle.gif\" width=\"350\" height=\"80\"\u003e |\nTriangle top  |  \u003cimg src=\"https://github.com/pujiaxin33/JXExampleImages/blob/master/JXSegmentedView/Indicator/TriangleTop.gif\" width=\"350\" height=\"80\"\u003e |\nBackground  |  \u003cimg src=\"https://github.com/pujiaxin33/JXExampleImages/blob/master/JXSegmentedView/Indicator/IndicatorBackground.gif\" width=\"350\" height=\"80\"\u003e |\nBackground with shadow  |  \u003cimg src=\"https://github.com/pujiaxin33/JXExampleImages/blob/master/JXSegmentedView/Indicator/IndicatorBackgroundShadow.gif\" width=\"350\" height=\"80\"\u003e |\nBackground mask  |  \u003cimg src=\"https://github.com/pujiaxin33/JXExampleImages/blob/master/JXSegmentedView/Indicator/IndicatorBackgroundMask.gif\" width=\"350\" height=\"80\"\u003e |\nBackground mask without bottom view |  \u003cimg src=\"https://github.com/pujiaxin33/JXExampleImages/blob/master/JXSegmentedView/Indicator/IndicatorBackgroundMaskPure.gif\" width=\"350\" height=\"80\"\u003e |\nBackground gradient\u003cbr\u003e(fixed)  |  \u003cimg src=\"https://github.com/pujiaxin33/JXExampleImages/blob/master/JXSegmentedView/Indicator/IndicatorBackgroundGradient.gif\" width=\"350\" height=\"80\"\u003e |\nGradient\u003cbr\u003e(change with position)  |  \u003cimg src=\"https://github.com/pujiaxin33/JXExampleImages/blob/master/JXSegmentedView/Indicator/IndicatorGradient.gif\" width=\"350\" height=\"80\"\u003e |\nImage bottom  |  \u003cimg src=\"https://github.com/pujiaxin33/JXExampleImages/blob/master/JXSegmentedView/Indicator/IndicatorImageBottom.gif\" width=\"350\" height=\"80\"\u003e |\nImage background  |  \u003cimg src=\"https://github.com/pujiaxin33/JXExampleImages/blob/master/JXSegmentedView/Indicator/IndicatorImageBG.gif\" width=\"350\" height=\"80\"\u003e |\nmixed indicators |  \u003cimg src=\"https://github.com/pujiaxin33/JXExampleImages/blob/master/JXSegmentedView/Indicator/IndicatorMixed.gif\" width=\"350\" height=\"80\"\u003e |\n\nThe following indicators support up and down position switching：\n`JXSegmentedIndicatorLineView`、`JXSegmentedIndicatorRainbowLineView`、`JXSegmentedIndicatorDotLineView`、`JXSegmentedIndicatorDoubleLineView`、`JXSegmentedIndicatorTriangleView`、`JXSegmentedIndicatorImageView`\n\n### Cell Preview\n\nDescription | Gif |\n----|------|\ntitle color gradient  |  \u003cimg src=\"https://github.com/pujiaxin33/JXExampleImages/blob/master/JXSegmentedView/Cell/ColorGradient.gif\" width=\"350\" height=\"80\"\u003e |\ntext color gradient  |  \u003cimg src=\"https://github.com/pujiaxin33/JXExampleImages/blob/master/JXSegmentedView/Cell/TextGradient.gif\" width=\"350\" height=\"80\"\u003e |\ntransform zoom  |  \u003cimg src=\"https://github.com/pujiaxin33/JXExampleImages/blob/master/JXSegmentedView/Cell/ZoomOnly.gif\" width=\"350\" height=\"80\"\u003e |\ntransform zoom + stroke width  |  \u003cimg src=\"https://github.com/pujiaxin33/JXExampleImages/blob/master/JXSegmentedView/Cell/ZoomStrokeWidth.gif\" width=\"350\" height=\"80\"\u003e |\ntransform zoom + selected animation  |  \u003cimg src=\"https://github.com/pujiaxin33/JXExampleImages/blob/master/JXSegmentedView/Cell/ZoomAnimation.gif\" width=\"350\" height=\"80\"\u003e |\ntransform zoom + cell width zoom  |  \u003cimg src=\"https://github.com/pujiaxin33/JXExampleImages/blob/master/JXSegmentedView/Cell/ZoomCellWidth.gif\" width=\"350\" height=\"80\"\u003e |\nTitleImage_Top |  \u003cimg src=\"https://github.com/pujiaxin33/JXExampleImages/blob/master/JXSegmentedView/Cell/TitleImageTop.gif\" width=\"350\" height=\"80\"\u003e |\nTitleImage_Left |  \u003cimg src=\"https://github.com/pujiaxin33/JXExampleImages/blob/master/JXSegmentedView/Cell/TitleImageLeft.gif\" width=\"350\" height=\"80\"\u003e |\nTitleImage_Bottom |  \u003cimg src=\"https://github.com/pujiaxin33/JXExampleImages/blob/master/JXSegmentedView/Cell/TitleImageBottom.gif\" width=\"350\" height=\"80\"\u003e |\nTitleImage_Right |  \u003cimg src=\"https://github.com/pujiaxin33/JXExampleImages/blob/master/JXSegmentedView/Cell/TitleImageRight.gif\" width=\"350\" height=\"80\"\u003e |\nTitleImage_OnlyImage |  \u003cimg src=\"https://github.com/pujiaxin33/JXExampleImages/blob/master/JXSegmentedView/Cell/TitleImageOnlyImage.gif\" width=\"350\" height=\"80\"\u003e |\nTitleOrImage |  \u003cimg src=\"https://github.com/pujiaxin33/JXExampleImages/blob/master/JXSegmentedView/Cell/TitleOrImage.gif\" width=\"350\" height=\"80\"\u003e |\nnumber |  \u003cimg src=\"https://github.com/pujiaxin33/JXExampleImages/blob/master/JXSegmentedView/Cell/Number.gif\" width=\"350\" height=\"80\"\u003e |\ndot |  \u003cimg src=\"https://github.com/pujiaxin33/JXExampleImages/blob/master/JXSegmentedView/Cell/CellDot.gif\" width=\"350\" height=\"80\"\u003e |\nattributed text |  \u003cimg src=\"https://github.com/pujiaxin33/JXExampleImages/blob/master/JXSegmentedView/Cell/TitleAttributed.gif\" width=\"350\" height=\"80\"\u003e |\nmixed cells |  \u003cimg src=\"https://github.com/pujiaxin33/JXExampleImages/blob/master/JXSegmentedView/Cell/MixedCell.gif\" width=\"350\" height=\"80\"\u003e |\n\n### Special Preview\n\nDescription | Gif |\n----|------|\nless data\u003cbr/\u003e isItemSpacingAverageEnabled is true |  \u003cimg src=\"https://github.com/pujiaxin33/JXExampleImages/blob/master/JXSegmentedView/Special/ItemAveTrue.gif\" width=\"350\" height=\"80\"\u003e |\nless data\u003cbr/\u003e isItemSpacingAverageEnabled is false |  \u003cimg src=\"https://github.com/pujiaxin33/JXExampleImages/blob/master/JXSegmentedView/Special/ItemAveFalse.gif\" width=\"350\" height=\"80\"\u003e |\nSegmentedControl\u003cbr/\u003ereference[`SegmentedControlViewController`](https://github.com/pujiaxin33/JXSegmentedView/blob/master/JXSegmentedView/Special/SegmentedControl/SegmentedControlViewController.swift) |  \u003cimg src=\"https://github.com/pujiaxin33/JXExampleImages/blob/master/JXSegmentedView/Special/SegmentedControl.gif\" width=\"350\" height=\"80\"\u003e |\nSegmentedControl\u003cbr/\u003ereference[`SegmentedControlViewController`](https://github.com/pujiaxin33/JXSegmentedView/blob/master/JXSegmentedView/Special/SegmentedControl/SegmentedControlViewController.swift) |  \u003cimg src=\"https://github.com/pujiaxin33/JXExampleImages/blob/master/JXSegmentedView/Special/SegmentedControl.gif\" width=\"350\" height=\"80\"\u003e |\nuse in navigation bar \u003cbr/\u003ereference[`NaviSegmentedControlViewController`](https://github.com/pujiaxin33/JXSegmentedView/blob/master/JXSegmentedView/Special/SegmentedControl/NaviSegmentedControlViewController.swift) |  \u003cimg src=\"https://github.com/pujiaxin33/JXExampleImages/blob/master/JXSegmentedView/Special/NavigationBar.gif\" width=\"350\" height=\"80\"\u003e |\nnestable\u003cbr/\u003ereference[`NestViewController`](https://github.com/pujiaxin33/JXSegmentedView/blob/master/JXSegmentedView/Special/Nest/NestViewController.swift) |  \u003cimg src=\"https://github.com/pujiaxin33/JXExampleImages/blob/master/JXSegmentedView/Special/Nest.gif\" width=\"350\" height=\"200\"\u003e |\nuser profile page\u003cbr/\u003ereference[`PagingViewController`](https://github.com/pujiaxin33/JXSegmentedView/blob/master/JXSegmentedView/Special/Personal/PagingViewController.swift)\u003cbr/\u003e more styles just click[JXPagingView](https://github.com/pujiaxin33/JXPagingView) |  \u003cimg src=\"https://github.com/pujiaxin33/JXExampleImages/blob/master/JXSegmentedView/Special/Personal.gif\" width=\"350\" height=\"567\"\u003e |\ndata load \u0026 refresh\u003cbr/\u003ereference[`LoadDataViewController`](https://github.com/pujiaxin33/JXSegmentedView/blob/master/JXSegmentedView/Special/LoadData/WithListContainerView/LoadDataViewController.swift) |  \u003cimg src=\"https://github.com/pujiaxin33/JXExampleImages/blob/master/JXSegmentedView/Special/LoadData.gif\" width=\"350\" height=\"200\"\u003e |\n\n\n## Requirements\n\n- iOS 9.0+\n- Xcode 9+\n- Swift 4.2、5.0\n\n## Installation\n\n### Manual\n\nClone the code and drag the Sources folder into the project to use it.\n\n### CocoaPods\n\n```ruby\ntarget '\u003cYour Target Name\u003e' do\n    pod 'JXSegmentedView'\nend\n```\nExecute `pod repo update` first, then execute `pod install`\n\n\n## Usage\n\n### `JXSegmentedView` example\n\n1.JXSegmentedView initialize\n```Swift\nself.segmentedView = JXSegmentedView()\nself.segmentedView.delegate = self\nself.view.addSubview(self.segmentedView)\n```\n\n2.dataSource initialize\n\nThe `dataSouce` type is the `JXSegmentedViewDataSource` protocol. Use a separate class to implement the `JXSegmentedViewDataSource` protocol for code isolation. By selecting different class assignments to `dataSource`, you can control the `JXSegmentedView` display effect and implement plugin. For example, selecting the JXSegmentedTitleImageDataSource class as the dataSource selects the display effect of the text image; selecting the JXSegmentedNumberDataSource class as the dataSource selects the display effect of the text \u0026 number;\n```Swift\n//segmentedDataSource must be strongly held by the property, or it will be released\nself.segmentedDataSource = JXSegmentedTitleDataSource()\n//Configuring data source related properties\nself.segmentedDataSource.titles = [\"猴哥\", \"青蛙王子\", \"旺财\"]\nself.segmentedDataSource.isTitleColorGradientEnabled = true\n//The reloadData(selectedIndex:) method must be called, and the method will internally refresh the data source array.\nself.segmentedDataSource.reloadData(selectedIndex: 0)\n//Associated dataSource\nself.segmentedView.dataSource = self.segmentedDataSource\n```\n\n3.Indicator initialize\n```Swift\nlet indicator = JXSegmentedIndicatorLineView()\nindicator.indicatorWidth = 20\nself.segmentedView.indicators = [indicator]\n```\n\n4.Implement `JXSegmentedViewDelegate`\n```Swift\n//This method is called when you click to select or scroll to select. Applicable to only care about selected events, regardless of whether it is click or scroll.\nfunc segmentedView(_ segmentedView: JXSegmentedView, didSelectedItemAt index: Int) {}\n\n// This method will be called when the selected condition is clicked.\nfunc segmentedView(_ segmentedView: JXSegmentedView, didClickSelectedItemAt index: Int) {}\n\n// This method is called when the scroll is selected.\nfunc segmentedView(_ segmentedView: JXSegmentedView, didScrollSelectedItemAt index: Int) {}\n\n// Then callback when scrolling\nfunc segmentedView(_ segmentedView: JXSegmentedView, scrollingFrom leftIndex: Int, to rightIndex: Int, percent: CGFloat) {}\n```\n\n### `contentScrollView` list container usage example\n\n#### Use the `UIScrollView` custom usage example directly\n\nBecause the code is scattered and the amount of code is large, it is not recommended. There are many places to pay attention to when using it properly, especially for students who are new to iOS.\n\nDo not directly paste the code, click [LoadDataCustomViewController](https://github.com/pujiaxin33/JXSegmentedView/blob/master/JXSegmentedView/Special/LoadData/ListCustom/LoadDataCustomViewController.swift) to view the source code.\n\nAs an alternative, the official use \u0026 is highly recommended to use the following in this way 👇👇👇.\n\n#### Use the example of the `JXSegmentedListContainerView` wrapper class\n\n`JXSegmentedListContainerView` is a highly encapsulated class for list views with the following advantages:\n- Compared to the direct use of `UIScrollView` customization, the package is high, the code is centralized, and the use is simple;\n- List lazy loading: List initialization is only performed when a list is displayed. Instead of loading all the lists at once, the performance is better;\n\n1.`JXSegmentedListContainerView` initialize\n```Swift\nself.listContainerView = JXSegmentedListContainerView(dataSource: self)\nself.view.addSubview(self.listContainerView)\n//Associate the cotentScrollView\nself.segmentedView.contentScrollView = self.listContainerView.scrollView\n```\n\n2.Implement `JXSegmentedListContainerViewDataSource`\n```Swift\n//return numbers of lists\nfunc numberOfLists(in listContainerView: JXSegmentedListContainerView) -\u003e Int {\n    return self.segmentedDataSource.titles.count\n}\n//return the instance which comform `JXSegmentedListContainerViewListDelegate`\nfunc listContainerView(_ listContainerView: JXSegmentedListContainerView, initListAt index: Int) -\u003e JXSegmentedListContainerViewListDelegate {\n    return ListBaseViewController()\n}\n```\n\n3.Implement `JXSegmentedListContainerViewListDelegate` for list\n\nRegardless of whether the type of the list is UIView or UIViewController\n```Swift\n/// If the list is VC, return VC.view\n/// If the list is View, return to View itself\n/// - Returns: list \nfunc listView() -\u003e UIView {\n    return view\n}\n\n//Optional use, when the list is displayed\nfunc listDidAppear() {}\n\n//Optional use, called when the list disappears\nfunc listDidDisappear() {}\n```\n\n4.Tell the key event `JXSegmentedListContainerView`\n\nIn the following two `JXSegmentedViewDelegate` proxy methods, call the corresponding code, don't forget this one❗️❗️❗️\n```Swift\nfunc segmentedView(_ segmentedView: JXSegmentedView, didClickSelectedItemAt index: Int) {\n    //Pass the didClickSelectedItemAt event to the listContainerView, which must be called! ! !\n    listContainerView.didClickSelectedItem(at: index)\n}\n\nfunc segmentedView(_ segmentedView: JXSegmentedView, scrollingFrom leftIndex: Int, to rightIndex: Int, percent: CGFloat) {\n    //Pass the scrolling event to the listContainerView, which must be called! ! !\n    listContainerView.segmentedViewScrolling(from: leftIndex, to: rightIndex, percent: percent, selectedIndex: segmentedView.selectedIndex)\n}\n```\n\nClick [LoadDataViewController](https://github.com/pujiaxin33/JXSegmentedView/blob/master/JXSegmentedView/Special/LoadData/WithListContainerView/LoadDataViewController.swift) to see the source code.\n\n### Usage Summary\n\nBecause `JXSegmentedView`  supports many features: indicators, cell styles, list containers, etc. How to manage the code orderly becomes a problem. The use of protocols, inheritance, and encapsulation classes greatly simplifies the use, and increases flexibility, making extensions quite easy.\n\n- Core main class：`JXSegmentedView`\n- Data Source \u0026 Cell Style Custom Class: Classes that follow the `JXSegmentedViewDataSource` protocol\n- Indicator class: `UIView` class that complies with the `JXSegmentedIndicatorProtocol` protocol\n- List container: officially recommended `JXSegmentedListContainerView` class, special case can be customized using `UIScrollView`\n\n### Indicator style customization\n\n- To inherit the `JXSegmentedIndicatorProtocol` protocol, click on [JXSegmentedIndicatorProtocol](https://github.com/pujiaxin33/JXSegmentedView/blob/master/Sources/Indicator/JXSegmentedIndicatorProtocol.swift)\n- The base class `JXSegmentedIndicatorBaseView` inheriting the `JXSegmentedIndicatorProtocol` protocol is provided, which provides many basic properties. Click to see [JXSegmentedIndicatorBaseView](https://github.com/pujiaxin33/JXSegmentedView/blob/master/Sources/Indicator/JXSegmentedIndicatorBaseView.swift)\n- Custom indicator, please refer to the implemented indicator view, try more, think more, please ask Issue or join feedback QQ group if you have any questions.\n\n\n### dataSource and Cell customization\n\n- Need to inherit the `JXSegmentedViewDataSource` protocol, click on [JXSegmentedViewDataSource](https://github.com/pujiaxin33/JXSegmentedView/blob/master/Sources/Core/JXSegmentedView.swift)\n- Provides the base class `JXSegmentedBaseDataSource` that inherits the `JXSegmentedViewDataSource` protocol, which provides many basic properties. Click to see [JXSegmentedBaseDataSource](https://github.com/pujiaxin33/JXSegmentedView/blob/master/Sources/Core/JXSegmentedBaseDataSource.swift)\n- Any custom requirements, dataSource, cell, itemModel must be subclassed. Even if a subclass cell does nothing. Used to maintain the inheritance chain, so as not to know who to inherit after subclassing;\n- dataSource and Cell customization, please refer to the implemented dataSource, try more, think more, please ask Issue or join feedback QQ group if you have any questions.\n\n## Common Attribute Description\n\n[Common attribute description document address](https://github.com/pujiaxin33/JXSegmentedView/blob/master/Document/English/property.md)\n\n## Other Usage Tips\n\n[Other usage tips document address](https://github.com/pujiaxin33/JXSegmentedView/blob/master/Document/English/tips.md)\n\n## Supplement\n\nIf you are just starting to use `JXSegmentedView`, be sure to search for the documentation or source code when you need to support certain features during development. Confirm that you have implemented the features you want to support. Please don't ask the documentation and source code to see it, just ask questions directly. This is a waste of time for everyone. If you don't support the features you want, feel free to ask for an discussion, or implement a PullRequest yourself.\n\nIf you have any suggestions or questions, you can contact me by：\u003c/br\u003e\nE-mail：317437084@qq.com \u003c/br\u003e\nQQ Group： 112440276\n\n\u003cimg src=\"https://note.youdao.com/yws/public/resource/c6fa96a65e424afcf7f6304ddf5c283a/xmlnote/8dc821d271c35845acff3f853f434bce/3913\" width=\"300\" height=\"411\"\u003e\n\nIf you like, just star❤️ it.\n\n## License\n\nJXSegmentedView is released under the MIT license.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpujiaxin33%2FJXSegmentedView","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpujiaxin33%2FJXSegmentedView","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpujiaxin33%2FJXSegmentedView/lists"}