我正在尝试从故事板中配置UIPageViewController:
TutorialPageViewController.h
#import <UIKit/UIKit.h>
@interface TutorialPageViewController : UIPageViewController <UIPageViewControllerDelegate, UIPageViewControllerDataSource>
@end
TutorialPageViewController.m
#import "TutorialPageViewController.h"
@interface TutorialPageViewController ()
@property (assign, nonatomic) NSInteger index;
@end
@implementation TutorialPageViewController
{
NSArray *myViewControllers;
}
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
self.delegate = self;
self.dataSource = self;
[self didMoveToParentViewController:self];
UIStoryboard *tutorialStoryboard = [UIStoryboard storyboardWithName:@"TutorialStoryboard" bundle:[NSBundle mainBundle]];
UIViewController *tuto1 = [tutorialStoryboard instantiateViewControllerWithIdentifier:@"TutorialPageViewController_1"];
UIViewController *tuto2 = [tutorialStoryboard instantiateViewControllerWithIdentifier:@"TutorialPageViewController_2"];
myViewControllers = @[tuto1, tuto2, tuto1, tuto2];
self.index = 0;
[self setViewControllers:@[tuto1] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];
}
- (UIViewController *)viewControllerAtIndex:(NSUInteger)index {
return myViewControllers[index];
}
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController {
NSUInteger index = self.index;
if (index == 0) { return nil; }
// Decrease the index by 1 to return
index--;
return [self viewControllerAtIndex:index];
}
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController {
NSUInteger index = self.index;
index++;
if (index > [myViewControllers count]) { return nil; }
return [self viewControllerAtIndex:index];
}
- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController {
// The number of items reflected in the page indicator.
return [myViewControllers count];
}
- (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController {
// The selected item reflected in the page indicator.
return 0;
}
@end
问题是……
- 第一页用页面指示器显示效果很好,滑动时
- 我可以看到第二页。
*切换完成后,黑屏(页面指示器正确显示第2页),无法进行用户交互。
8条答案
按热度按时间vngu2lb81#
2023. Swift更新。
2017年答案...
如今,这是死容易做到这一点简单地使用故事板。
这种“全屏滑动教程”作为应用程序“介绍”流行了一段时间,所以我把下面的类称为
IntroPages
。第一步,做一个容器视图,容器视图为UIPageViewController。
如果是iOS新手,这里有一个container view tutorial。
(注意:如果您不知道如何将容器视图“更改”为UIPageViewController,请向下滚动到该教程中的**“如何更改...”**部分!
)
你可以让容器任何你想要的形状。和任何容器视图一样,它可以是全屏的,也可以是屏幕的一小部分--任何你想要的。
第二步,
制作四个简单的、普通的视图控制器,它们可以是任何你想要的-图像、文本、表格,任何东西。
请注意,他们只是坐在那里你的故事板,不要链接到任何东西。
第三步,需要设置这四个页面的ID,id 1、id 2、id 3、id 4即可。
第四步,复制并粘贴!
(Look在注解中-根据您的喜好,有用于循环或线性分页的代码。)
在故事板上查看UIPageViewController。将类设置为
IntroPages
。就这么简单-你完了。
您只需在情节串连图板上设置过渡样式,
很可能你想要的是“滚动”,而不是另一个。
使用正常、常用、“.scroll”模式的重要注意事项...
令人难以置信的是,苹果已经从Xcode故事板的IB下拉列表中删除了正常的“.scroll”选项。
(On故事板,他们只允许你选择奇怪的选项,如“ curl ”,从来没有人使用。)
你现在必须在代码中完成这一点,这很简单。添加这一行:
这是愚蠢的,但这就是它的方式。
你完了!现在…
添加UIPageControl介绍...
您可以在最高级别的 Package 器类中添加
UIPageControl
,即上面图像示例中的“Intro”。(So,令人惊讶的是 * 不是 * 在页面视图控制器中,而不是在“IntroPages”中。)
因此,在故事板上,非常简单地将
UIPageControl
拖到“Intro”上。注意!奇怪的是,在故事板中,你不能移动UIPageControl。
当你把一个页面控件拖到视图控制器上时,它只是坐在一个固定的地方。这很奇怪,但事实就是如此。不要浪费时间试图移动它:)
在Intro中,您需要以通常的方式访问页面视图控制器(IntroPages):
请注意这一关键行:
添加此功能
然后在情节提要中单击页面控件并将valueChanged拖动到该函数。
该函数的最简单的大纲版本是
但是请参见本QAhttps://stackoverflow.com/questions/66545624,以了解更全面的调查。
在IntroPages中添加属性...
在IntroPages中还添加以下内容,以便当用户滑动屏幕时,UIPageControl知道该做什么:
在IntroPages中,由于Apple的错误/异常行为,还添加了以下内容:
你已经在路上了
u1ehiz5o2#
对于希望看到工作页面滚动(向前/向后)的用户
只是为了补充Editoror的这个伟大的答案,如果你喜欢“循环”分页,下面是你要做的:仍然使用相同的EditOR技术
tyky79it3#
使用Swift代码为
UIPageViewController
类扩展Joe Blow's answer:阅读更多关于using UIPageViewController with container view的故事板设置。
9q78igpj4#
在Storyboard中似乎有很多关于UIPageViewController的问题。
这里是some demo code,向您展示如何在故事板中使用UIPageViewController作为独立的全屏视图或UIContainerView,如果您只想在屏幕的一小部分区域分页。
zlhcx6iw5#
Swift 3更新:
icnyk63a6#
要使用@samwize的答案无限回滚,您需要添加条件来检查负值。否则,您只需在第一页和第二页之间切换。只有当您计划有两个以上的页面时,才需要这样做。
ffvjumwh7#
问题是您不正确地重用了
UIViewController
示例:我建议您拥有一个
NSMutableSet
,它将作为可重用UIViewController
示例的池。在
viewControllerBeforeViewController:
和viewControllerBeforeViewController:
中,使用NSPredicate
搜索NSMutableSet
,找到一个UIViewController
,其中parentViewController
等于nil
。如果找到一个,返回它。如果没有,示例化一个新的,将其添加到NSMutableSet
,然后返回它。当您完成并且测试通过时,您可以将池提取到它自己的类中。
a64a0gku8#
Swift 5答案: