2017-02-01 6 views
1

私はUIViewControllerを持っており、プログラムでUIPageViewControllerを追加しました。 0インデックスまたは最後のインデックスの場合、UIViewControllerのバウンス(スクロール)を停止する方法は?私はバウンスを意味する。UIPageViewControllerを使用して最初と最後のインデックスでUIScrollViewのバウンスを停止する方法はありますか?

あなたは、このリンクをチェックすることができます。How to create PageView with UITabBar or Segment Control using swift?

そしてここでは私のコードです:

import UIKit 

class ViewController: UIViewController { 

fileprivate var pageViewController:UIPageViewController! 
@IBOutlet weak var paginationView:UIView! 
@IBOutlet var btnYourGroup: UIButton! 
@IBOutlet var btnSharedBy: UIButton! 
@IBOutlet var sliderViewLeadingConst: NSLayoutConstraint! 

fileprivate var selectedIndex : Int? { 
    didSet { 
     var leading:CGFloat = 0 
     if selectedIndex == 0 { 
      leading = 0 
     } 
     else { 
      leading = self.view.frame.size.width/2 
     } 

     self.sliderViewLeadingConst.constant = leading 

     UIView.animate(withDuration: 0.2, animations: { 

      self.view.layoutIfNeeded() 
     }) 
    } 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    //SetUp Pagination 
    setupPagination() 

    for view in self.pageViewController.view.subviews { 
     if let scrollView = view as? UIScrollView { 
      scrollView.delegate = self 
      break 
     } 
    } 

    //btnSharedBy.titleColor(for: UIControlState) 
    btnSharedBy.setTitleColor(UIColor.lightGray, for: UIControlState()) 
} 

private func setupPagination() { 

    let startVC = self.viewControllerAtIndex(index: 0) 
    let vc = [startVC] 
    self.pageViewController = UIPageViewController(transitionStyle: .scroll, navigationOrientation: .horizontal, options: nil) 
    self.pageViewController.setViewControllers(vc, direction: .reverse, animated: true, completion: nil) 
    self.pageViewController.dataSource = self 
    self.pageViewController.delegate = self 
    self.pageViewController.view.frame.size = self.paginationView.frame.size 
    self.paginationView.addSubview(self.pageViewController.view) 
} 

@IBAction func mainCateogryTapped(sender:UIButton) { 
    loadNextController(index:sender.tag) 
} 

fileprivate func viewControllerAtIndex(index:Int) -> PageContentViewController { 

    let feedsVC = self.storyboard?.instantiateViewController(withIdentifier: "PageContentViewController") as! PageContentViewController 
    feedsVC.pageIndex = index 
    return feedsVC 
} 

fileprivate func loadNextController(index:Int) { 

    if selectedIndex == index { 
     return 
    } 

    let nextViewController = viewControllerAtIndex(index:index) 
    selectedIndex = index 

    if index == 0 { 
     btnSharedBy.setTitleColor(UIColor.lightGray, for: UIControlState()) 
     btnYourGroup.setTitleColor(UIColor.white, for: UIControlState()) 
     self.pageViewController?.setViewControllers([nextViewController], direction: UIPageViewControllerNavigationDirection.reverse, animated: true, completion: nil) 
    } else if index == 1 { 
     btnSharedBy.setTitleColor(UIColor.white, for: UIControlState()) 
     btnYourGroup.setTitleColor(UIColor.lightGray, for: UIControlState()) 
     self.pageViewController?.setViewControllers([nextViewController], direction: UIPageViewControllerNavigationDirection.forward, animated: true, completion: nil) 
    } 

    else { 

    } 
    } 
} 
extension ViewController: UIPageViewControllerDataSource { 

func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { 

    var index = (viewController as! PageContentViewController).pageIndex 

    if index == 0 { 
     return nil 
    } 
    index = index - 1 
    return viewControllerAtIndex(index:index) 

} 

func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { 

    var index = (viewController as! PageContentViewController).pageIndex 

    index = index + 1 
    if index == 2 { 
     //self.pageViewController. 
     return nil 
    } 
    return viewControllerAtIndex(index:index) 
} 

func pageViewController(_ pageViewController: UIPageViewController, willTransitionTo pendingViewControllers: [UIViewController]) { 

    let vc : PageContentViewController = pendingViewControllers[0] as! PageContentViewController 
    selectedIndex = vc.pageIndex 
    } 
} 

extension ViewController : UIPageViewControllerDelegate { 

func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) { 
    if completed { 
     let vc = previousViewControllers.first as! PageContentViewController 

     if 0 == vc.pageIndex { 
      selectedIndex = 1 
      btnSharedBy.setTitleColor(UIColor.white, for: UIControlState()) 
      btnYourGroup.setTitleColor(UIColor.lightGray, for: UIControlState()) 

     } 

     else { 
      btnYourGroup.setTitleColor(UIColor.white, for: UIControlState()) 
      btnSharedBy.setTitleColor(UIColor.lightGray, for: UIControlState()) 
      selectedIndex = 0 
     } 
    } 

    else if !completed { 
     let pageContentView = previousViewControllers[0] as! PageContentViewController; 
     self.selectedIndex = pageContentView.pageIndex 
    } 
    } 
} 

//ScrollView Delegate 
extension ViewController : UIScrollViewDelegate { 

func scrollViewDidScroll(_ scrollView: UIScrollView) { 
    let point = scrollView.contentOffset 
    var percentComplete: CGFloat 
    percentComplete = fabs(point.x - view.frame.size.width)/view.frame.size.width 
    //NSLog("percentComplete: %f", percentComplete) 

     if(0.8 > percentComplete) 
     { 
      //selectedIndex = 1 
      scrollView.bounces = false 
     } 

     else 
     { 
      scrollView.bounces = true 

     } 
    } 
} 

はどのようにしても、ボタンのインジケーターで最初と最後のインデックスで問題をバウンス停止することができますか?

+0

:falseにbouncesプロパティを設定するために、そのコードを適応させることは簡単だろうか?これはあなたにとってどのように論理的ですか?バウンス効果は、最初と最後のインデックスでのみ発生します。バウンスは何ですか。 –

+0

私の要求は、私が跳ねたくはありません。 ありがとう – kishor0011

+0

http://stackoverflow.com/questions/21798218/disable-uipageviewcontroller-bounceここをクリック –

答えて

2

ページビューコントローラーのサブビューを歩き回って、スクロールビューを探して、バウンスをfalseに設定することができます。しかし、これは脆弱な解決策であり、不都合なことです。 (一般に、ビューコントローラのビューを混乱させるのは悪い考えです。特に、それらを見つけるパブリックインターフェイスがない場合)

以下のスレッドは、ページビューコントローラのサブビューを歩き、スクロールビューを見つけるコードを持っています。あなたが最初と最後のインデックスからバウンスを停止したいと思うのはなぜ

Progress of UIPageViewController

+0

OKありがとう、私はこれを試してみます。 しかし、私のコードを一度見ることができ、どこを変更しなければならないかを教えてもらえればよいでしょう。 ありがとう – kishor0011

+0

私が提案した変更をviewDidLoadに入れてください。私はあなたのためにそれを書くつもりはありません。スクロール・ビューを見つけるコードへのリンクが見つかりました。スクロールビューのbouncesプロパティをfalseに変更するには、そのコードを変更するのが簡単です。 –

+0

確認します。 ありがとう – kishor0011

関連する問題