@@ -25,7 +25,7 @@ public extension PagingMenuControllerDelegate {
2525internal let MinimumSupportedViewCount = 1
2626internal let VisiblePagingViewNumber = 3
2727
28- open class PagingMenuController : UIViewController , PagingValidator {
28+ open class PagingMenuController : UIViewController {
2929 weak public var delegate : PagingMenuControllerDelegate ? {
3030 didSet {
3131 guard let menuView = menuView else { return }
@@ -355,8 +355,23 @@ extension PagingMenuController: Pagable {
355355 }
356356}
357357
358- extension PagingMenuController : PageDetectable {
359- var currentPagingViewPosition : PagingViewPosition {
358+ // MARK: Page Control
359+
360+ extension PagingMenuController {
361+ fileprivate enum PagingViewPosition {
362+ case left, center, right, unknown
363+
364+ init ( order: Int ) {
365+ switch order {
366+ case 0 : self = . left
367+ case 1 : self = . center
368+ case 2 : self = . right
369+ default : self = . unknown
370+ }
371+ }
372+ }
373+
374+ fileprivate var currentPagingViewPosition : PagingViewPosition {
360375 guard let pagingViewController = pagingViewController else { return . unknown }
361376 let pageWidth = pagingViewController. contentScrollView. frame. width
362377 let order = Int ( ceil ( ( pagingViewController. contentScrollView. contentOffset. x - pageWidth / 2 ) / pageWidth) )
@@ -371,7 +386,7 @@ extension PagingMenuController: PageDetectable {
371386 return PagingViewPosition ( order: order + 1 )
372387 }
373388
374- var nextPageFromCurrentPosition : Int {
389+ fileprivate var nextPageFromCurrentPosition : Int {
375390 // set new page number according to current moving direction
376391 let page : Int
377392 switch options. lazyLoadingPage {
@@ -391,7 +406,7 @@ extension PagingMenuController: PageDetectable {
391406 return page
392407 }
393408
394- var nextPageFromCurrentPoint : Int {
409+ fileprivate var nextPageFromCurrentPoint : Int {
395410 guard let menuView = menuView else { return 0 }
396411
397412 let point = CGPoint ( x: menuView. contentOffset. x + menuView. frame. width / 2 , y: 0 )
@@ -403,14 +418,34 @@ extension PagingMenuController: PageDetectable {
403418 }
404419}
405420
406- extension PagingMenuController : GestureHandler {
407- func addTapGestureHandler( ) {
421+ // MARK: - GestureRecognizer
422+
423+ extension PagingMenuController {
424+ fileprivate var tapGestureRecognizer : UITapGestureRecognizer {
425+ let gestureRecognizer = UITapGestureRecognizer ( target: self , action: #selector( handleTapGesture) )
426+ gestureRecognizer. numberOfTapsRequired = 1
427+ return gestureRecognizer
428+ }
429+
430+ fileprivate var leftSwipeGestureRecognizer : UISwipeGestureRecognizer {
431+ let gestureRecognizer = UISwipeGestureRecognizer ( target: self , action: #selector( handleSwipeGesture) )
432+ gestureRecognizer. direction = . left
433+ return gestureRecognizer
434+ }
435+
436+ fileprivate var rightSwipeGestureRecognizer : UISwipeGestureRecognizer {
437+ let gestureRecognizer = UISwipeGestureRecognizer ( target: self , action: #selector( handleSwipeGesture) )
438+ gestureRecognizer. direction = . right
439+ return gestureRecognizer
440+ }
441+
442+ fileprivate func addTapGestureHandler( ) {
408443 menuView? . menuItemViews. forEach {
409444 $0. addGestureRecognizer ( tapGestureRecognizer)
410445 }
411446 }
412447
413- func addSwipeGestureHandler( ) {
448+ fileprivate func addSwipeGestureHandler( ) {
414449 guard let menuOptions = menuOptions else { return }
415450
416451 switch menuOptions. displayMode {
@@ -471,7 +506,7 @@ extension PagingMenuController: GestureHandler {
471506 }
472507}
473508
474- extension PagingMenuController : ViewCleanable {
509+ extension PagingMenuController {
475510 func cleanup( ) {
476511 if let menuView = self . menuView {
477512 menuView. cleanup ( )
@@ -485,3 +520,54 @@ extension PagingMenuController: ViewCleanable {
485520 }
486521 }
487522}
523+
524+ // MARK: Validator
525+
526+ extension PagingMenuController {
527+ fileprivate func validate( _ options: PagingMenuControllerCustomizable ) {
528+ validateDefaultPage ( options)
529+ validateContentsCount ( options)
530+ validateInfiniteMenuItemNumbers ( options)
531+ }
532+
533+ fileprivate func validateContentsCount( _ options: PagingMenuControllerCustomizable ) {
534+ switch options. componentType {
535+ case . all( let menuOptions, let pagingControllers) :
536+ guard menuOptions. itemsOptions. count == pagingControllers. count else {
537+ raise ( " number of menu items and view controllers doesn't match " )
538+ return
539+ }
540+ default : break
541+ }
542+ }
543+
544+ fileprivate func validateDefaultPage( _ options: PagingMenuControllerCustomizable ) {
545+ let maxCount : Int
546+ switch options. componentType {
547+ case . pagingController( let pagingControllers) : maxCount = pagingControllers. count
548+ case . all( _, let pagingControllers) :
549+ maxCount = pagingControllers. count
550+ case . menuView( let menuOptions) : maxCount = menuOptions. itemsOptions. count
551+ }
552+
553+ guard options. defaultPage >= maxCount || options. defaultPage < 0 else { return }
554+
555+ raise ( " default page is invalid " )
556+ }
557+
558+ fileprivate func validateInfiniteMenuItemNumbers( _ options: PagingMenuControllerCustomizable ) {
559+ guard case . all( let menuOptions, _) = options. componentType,
560+ case . infinite = menuOptions. displayMode else { return }
561+ guard menuOptions. itemsOptions. count < VisiblePagingViewNumber else { return }
562+
563+ raise ( " number of view controllers should be more than three with Infinite display mode " )
564+ }
565+
566+ fileprivate var exceptionName : String {
567+ return " PMCException "
568+ }
569+
570+ fileprivate func raise( _ reason: String ) {
571+ NSException ( name: NSExceptionName ( rawValue: exceptionName) , reason: reason, userInfo: nil ) . raise ( )
572+ }
573+ }
0 commit comments