프로그래밍 방식으로 페이지를 넘길 수 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];
역으로 유사합니다.