[ios] UIPageViewController에서 프로그래밍 방식으로 페이지를 넘길 수 있습니까?

프로그래밍 방식으로 페이지를 넘길 수 UIPageViewController있습니까?



답변

예, 다음과 같은 방법으로 가능합니다.

- (void)setViewControllers:(NSArray *)viewControllers
                 direction:(UIPageViewControllerNavigationDirection)direction
                  animated:(BOOL)animated
                completion:(void (^)(BOOL finished))completion;`

이는 페이지에서 첫 번째보기 컨트롤러를 설정하는 데 사용 된 것과 동일한 방법입니다. 마찬가지로 다른 페이지로 이동할 수도 있습니다.

viewControllers단일 뷰 컨트롤러가 아닌 배열입니까?

이는 페이지보기 컨트롤러에 iBook과 같은 “스파인”이있어 한 번에 2 페이지의 컨텐츠를 표시 할 수 있기 때문입니다. 한 번에 1 페이지의 내용을 표시하는 경우 1 요소 배열로 전달하십시오.

Swift의 예 :

pageContainer.setViewControllers([displayThisViewController], direction: .Forward, animated: true, completion: nil)


답변

이 작업도 필요했기 때문에이 작업을 수행하는 방법에 대해 자세히 설명하겠습니다.

참고 : 나는 당신이 당신의 생성을위한 표준 템플릿 양식을 사용하는 가정 UIPageViewController– 가지고있는 두 구조를 modelViewController하고 dataViewController그것을 호출 할 때를 만들었습니다. 내가 쓴 내용을 이해하지 못하면 다시 돌아가서 새 프로젝트를 작성하십시오.UIPageViewController 십시오. 당신은 그때 이해합니다.

따라서 특정 페이지로 넘어가려면 위에 나열된 다양한 방법을 설정해야합니다. 이 연습에서는 두 개의 뷰가 표시된 풍경 뷰 라고 가정합니다 . 또한 IBAction으로 구현하여 버튼 누르기 또는 그렇지 않은 작업으로 수행 할 수 있습니다. 선택기를 호출하고 필요한 항목을 전달하는 것만 큼 쉽습니다.

따라서이 예에서는 표시 될 두 개의 뷰 컨트롤러가 필요하며 선택적으로 책에서 앞으로 또는 뒤로 이동할 수 있습니다.

4 페이지와 5 페이지로 이동하여 앞으로 미끄러짐을 사용하는 위치를 하드 코딩했습니다. 여기에서 당신이해야 할 일은이 항목을 얻는 데 도움이되는 변수를 전달하는 것입니다 …

-(IBAction) flipToPage:(id)sender {

    // Grab the viewControllers at position 4 & 5 - note, your model is responsible for providing these.  
    // Technically, you could have them pre-made and passed in as an array containing the two items...

    DataViewController *firstViewController = [self.modelController viewControllerAtIndex:4 storyboard:self.storyboard];
    DataViewController *secondViewController = [self.modelController viewControllerAtIndex:5 storyboard:self.storyboard];

    //  Set up the array that holds these guys...

    NSArray *viewControllers = nil;

    viewControllers = [NSArray arrayWithObjects:firstViewController, secondViewController, nil];

    //  Now, tell the pageViewContoller to accept these guys and do the forward turn of the page.
    //  Again, forward is subjective - you could go backward.  Animation is optional but it's 
    //  a nice effect for your audience.

      [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:NULL];

    //  Voila' - c'est fin!  

}


답변

다음은 단일 페이지보기에 대한 다른 코드 예제입니다. viewControllerAtIndex 에 대한 구현 은 여기에서 생략되며 주어진 인덱스에 대해 올바른보기 컨트롤러를 리턴해야합니다.

- (void)changePage:(UIPageViewControllerNavigationDirection)direction {
    NSUInteger pageIndex = ((FooViewController *) [_pageViewController.viewControllers objectAtIndex:0]).pageIndex;

    if (direction == UIPageViewControllerNavigationDirectionForward) {
        pageIndex++;
    }
    else {
        pageIndex--;
    }

    FooViewController *viewController = [self viewControllerAtIndex:pageIndex];

    if (viewController == nil) {
        return;
    }

    [_pageViewController setViewControllers:@[viewController]
                                  direction:direction
                                   animated:YES
                                 completion:nil];
}

전화로 페이지를 변경할 수 있습니다

[self changePage:UIPageViewControllerNavigationDirectionReverse];
[self changePage:UIPageViewControllerNavigationDirectionForward];


답변

나는 여기에 완전히 빠져있을 수 있지만이 솔루션은 다른 많은 사람들이 제안한 것보다 훨씬 간단 해 보입니다.

extension UIPageViewController {
    func goToNextPage(animated: Bool = true, completion: ((Bool) -> Void)? = nil) {
        if let currentViewController = viewControllers?[0] {
            if let nextPage = dataSource?.pageViewController(self, viewControllerAfter: currentViewController) {
                setViewControllers([nextPage], direction: .forward, animated: animated, completion: completion)
            }
        }
    }
}


답변

이 코드는 나에게 잘 작동했습니다. 감사합니다.

이것이 내가 한 일입니다. 앞으로 또는 뒤로 스테핑하는 방법과 특정 페이지로 직접 이동하는 방법 세로보기에서 6 페이지 문서입니다. pageViewController 템플릿의 RootController 구현에 붙여 넣으면 정상적으로 작동합니다.

-(IBAction)pageGoto:(id)sender {

    //get page to go to
    NSUInteger pageToGoTo = 4;

    //get current index of current page
    DataViewController *theCurrentViewController = [self.pageViewController.viewControllers   objectAtIndex:0];
    NSUInteger retreivedIndex = [self.modelController indexOfViewController:theCurrentViewController];

    //get the page(s) to go to
    DataViewController *targetPageViewController = [self.modelController viewControllerAtIndex:(pageToGoTo - 1) storyboard:self.storyboard];

    DataViewController *secondPageViewController = [self.modelController viewControllerAtIndex:(pageToGoTo) storyboard:self.storyboard];

    //put it(or them if in landscape view) in an array
    NSArray *theViewControllers = nil;
    theViewControllers = [NSArray arrayWithObjects:targetPageViewController, secondPageViewController, nil];


    //check which direction to animate page turn then turn page accordingly
    if (retreivedIndex < (pageToGoTo - 1) && retreivedIndex != (pageToGoTo - 1)){
        [self.pageViewController setViewControllers:theViewControllers direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:NULL];
    }

    if (retreivedIndex > (pageToGoTo - 1) && retreivedIndex != (pageToGoTo - 1)){
        [self.pageViewController setViewControllers:theViewControllers direction:UIPageViewControllerNavigationDirectionReverse animated:YES completion:NULL];
    }

}


-(IBAction)pageFoward:(id)sender {

    //get current index of current page
    DataViewController *theCurrentViewController = [self.pageViewController.viewControllers objectAtIndex:0];
    NSUInteger retreivedIndex = [self.modelController indexOfViewController:theCurrentViewController];

    //check that current page isn't first page
    if (retreivedIndex < 5){

        //get the page to go to
        DataViewController *targetPageViewController = [self.modelController viewControllerAtIndex:(retreivedIndex + 1) storyboard:self.storyboard];

        //put it(or them if in landscape view) in an array
        NSArray *theViewControllers = nil;
        theViewControllers = [NSArray arrayWithObjects:targetPageViewController, nil];

        //add page view
        [self.pageViewController setViewControllers:theViewControllers direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:NULL];

    }

}


-(IBAction)pageBack:(id)sender {


    //get current index of current page
    DataViewController *theCurrentViewController = [self.pageViewController.viewControllers objectAtIndex:0];
    NSUInteger retreivedIndex = [self.modelController indexOfViewController:theCurrentViewController];

    //check that current page isn't first page
    if (retreivedIndex > 0){

    //get the page to go to
    DataViewController *targetPageViewController = [self.modelController viewControllerAtIndex:(retreivedIndex - 1) storyboard:self.storyboard];

    //put it(or them if in landscape view) in an array
    NSArray *theViewControllers = nil;
    theViewControllers = [NSArray arrayWithObjects:targetPageViewController, nil];

    //add page view
    [self.pageViewController setViewControllers:theViewControllers direction:UIPageViewControllerNavigationDirectionReverse animated:YES completion:NULL];

    }

}


답변

스위프트 4 :

pagecontroller view controller에서 next를 탭하고 pageControl 인덱스를 업데이트 할 때 다음 컨트롤러로 이동해야했기 때문에 이것이 가장 쉽고 간단한 솔루션 이었습니다 .

let pageController = self.parent as! PageViewController

pageController.setViewControllers([parentVC.orderedViewControllers[1]], direction: .forward, animated: true, completion: nil)

pageController.pageControl.currentPage = 1


답변

dataSource의 메소드를 사용하는 것은 어떻습니까?

UIViewController *controller = [pageViewController.dataSource pageViewController:self.pageViewController viewControllerAfterViewController:pageViewController.viewControllers.firstObject];
[pageViewController setViewControllers:@[controller] direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil];

역으로 유사합니다.