2017-02-01 8 views
1

UIViewController가 있고 프로그래밍 방식으로 UIPageViewController를 추가했습니다. 0 인덱스 또는 마지막 인덱스에있는 경우 바운스 (스크롤) UIViewController 중지하는 방법? 나는 바운스를 의미한다. 당신은이 링크를 확인하실 수 있습니다 UIPageViewController를 사용하여 처음과 마지막 인덱스에서 UIScrollView 바운스를 중지하는 방법은 무엇입니까?

:

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 

     } 
    } 
} 

가 어떻게 또한 버튼 표시와 함께 첫 번째와 마지막 인덱스에 문제가 수신 거부 중지 할 수 있습니다 : 여기 How to create PageView with UITabBar or Segment Control using swift?

을 그리고 내 코드?

+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