WavePageControl allows you to effectively organise the Page Control indicators all at once.
Your app has large but limited amount of pages, more than such indicators amounts could fit into most of Page Controls?
You still want to have all indicators visible and have ability to navigate using Page Control?
- Show all page indicators visible for a large amounts of pages (let's say
40
) - Easily navigate through all the pages with swipe
- Quickly move to any page with just a single tap
- Clearly see the current selected page indicator among all (
40
) other - Customise indicators!
- Change default indicator style
- Create your own custom indicators
Swift Package Manager
dependencies: [
.package(url: "https://github.com/mrbodich/WavePageControl.git")
]
Add pod 'WavePageControl'
to your Podfile. "WavePageControl" is the name of the library.
If you like what you see here, and want to support the work being done in this repository, you could:
- Contribute code, issues and pull requests
- Let people know this library exists (:rocket: spread the word :rocket:)
If you are having questions or problems, you should:
- Make sure you are using the latest version of the library. Check the release-section.
- Search known issues for your problem (open and closed)
- Create new issues (please 🔥 search known issues before 🔥, do not create duplicate issues)
Subject | Description |
---|---|
Position | Satisfy position layout by creating 1 horizontal and 1 vertical constraint |
Size | WavePageControl controls size by itself, both vertical and horizontal. So keep it in mind and avoid conflicting/ambiguous constraints |
Parameter | Description |
---|---|
maxNavigationWidth | Maximum width of WavePageControl frame. After reaching this width, all indicators sizes will be recalculated to fit max width. |
defaultButtonHeight | Permanent height of active indicator. Other indicators will have this size until they fit into the maxNavigationWidth. Minimum size of inactive indicators is not limited. |
defaultSpacing | Spacing between indicators until they fit into the maxNavigationWidth. |
minSpacing | Once indicators start getting smaller, spacing is getting smaller too and limited with this value. |
updateLayout() | Apply changed parameters and rebuild layout. Animated by default. You can use UIView.performWithoutAnimation(_:) to eliminate animation. |
WavePageControl is utilising array of IDs to build page indicators.
WavePageControl is generic, thus ID
can be any type until it is Comparable
.
Property | Description |
---|---|
pageIDs | Array of ids. Can be changed in any way, you don't need to think about correct arrangement. WavePageControl is smart enough to calculate all movings/insertions/removals between the previous and new state and animate them properly. Actually you can even put another random array here and it will just work! |
currentPage | ID of an active indicator, optional. You can put any ID here or nil. If pageIDs does not contain such ID, no any error here, WavePageControl will just indicate no selection. Once such ID will appear in pageIDs, corresponding indicator will be automatically set as active. |
delegate | Set instance conforming to WavePageControlDelegate here. See next section for more info |
You can have advanced control over the WavePageControl using the WavePageControlDelegate. WavePageControlDelegate has 3 methods with existing default implementation, so you can optionally implement the ones you need.
Method | Description |
---|---|
createCustomPageView(id:) | Requires to return WavePageButtonView (that is UIView itself). Default implementation returns DefaultPageButtonView. See examples in Demo Project |
didSwipeScroll(_:, id:, isGestureCompleted:) | Called on swipe. It gives you a reference to WavePageControl, ID of indicator to select during all swipe, and a boolean state if gesture is completed. currentPage should be set explicitly here if needed. Default implementation will select it directly. |
didTap(_:, id:) | Called on tap. It gives you a reference to WavePageControl and ID of indicator to select. currentPage should be set explicitly here if needed. Default implementation will select it directly. |
You can download the app here in the 👉📱 App Store