diff --git a/FSPagerViewExamples.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/FSPagerViewExamples.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/FSPagerViewExamples.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Sources/FSPagerView.swift b/Sources/FSPagerView.swift index 7fb17d9..c46b18f 100644 --- a/Sources/FSPagerView.swift +++ b/Sources/FSPagerView.swift @@ -214,6 +214,14 @@ open class FSPagerView: UIView,UICollectionViewDataSource,UICollectionViewDelega return self.collectionView.panGestureRecognizer } + /// Returns an array of visible cells currently displayed by the pager view. + open var visibleCells: [FSPagerViewCell] { + return self.collectionView.visibleCells as! [FSPagerViewCell] + } + + /// To disable or enable multi scrolling interaction + open var isMultiScrollInteractionEnable = true + @objc open fileprivate(set) dynamic var currentIndex: Int = 0 // MARK: - Private properties @@ -260,6 +268,9 @@ open class FSPagerView: UIView,UICollectionViewDataSource,UICollectionViewDelega return animationKeys.contains(where: { rotationAnimationKeys.contains($0) }) } fileprivate var possibleTargetingIndexPath: IndexPath? + fileprivate var offsetAtBegin:CGPoint? { + didSet { if isMultiScrollInteractionEnable { offsetAtBegin = nil } } + } // MARK: - Overriden functions @@ -391,6 +402,14 @@ open class FSPagerView: UIView,UICollectionViewDataSource,UICollectionViewDelega } public func scrollViewDidScroll(_ scrollView: UIScrollView) { + if let offset = offsetAtBegin { + let pageSide:CGFloat = collectionViewLayout.itemSpacing + if scrollView.contentOffset.x > offset.x + pageSide { + scrollView.contentOffset.x = offset.x + pageSide + } else if scrollView.contentOffset.x < offset.x - pageSide { + scrollView.contentOffset.x = offset.x - pageSide + } + } if !self.isPossiblyRotating && self.numberOfItems > 0 { // In case someone is using KVO let currentIndex = lround(Double(self.scrollOffset)) % self.numberOfItems @@ -411,6 +430,7 @@ open class FSPagerView: UIView,UICollectionViewDataSource,UICollectionViewDelega if self.automaticSlidingInterval > 0 { self.cancelTimer() } + offsetAtBegin = scrollView.contentOffset } public func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer) { @@ -422,12 +442,16 @@ open class FSPagerView: UIView,UICollectionViewDataSource,UICollectionViewDelega if self.automaticSlidingInterval > 0 { self.startTimer() } + if velocity == .zero { + offsetAtBegin = nil + } } public func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { if let function = self.delegate?.pagerViewDidEndDecelerating { function(self) } + offsetAtBegin = nil } public func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) {