我对UIPageViewController有一个非常有趣的问题.
我的项目设置与示例基于页面的应用程序模板非常相似.偶尔(但在某种程度上可重现)某个平移手势会呼唤-(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController.
我返回下一页的viewcontroller,但是从不运行页面翻转动画,我的委托方法永远不会被调用.
这是代码 viewControllerAfterViewController
-(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
PageDisplayViewController *vc = (PageDisplayViewController *)viewController;
NSUInteger index = [self.pageFetchController.fetchedObjects indexOfObject:vc.page];
if(index == (self.pageFetchController.fetchedObjects.count - 1)) return nil;
return [self getViewControllerForIndex:(++index)];
}
Run Code Online (Sandbox Code Playgroud)
这里是 getViewControllerForIndex:
-(PageDisplayViewController *)getViewControllerForIndex:(NSUInteger)index
{
PageDisplayViewController *newVC = [self.storyboard instantiateViewControllerWithIdentifier:@"PageDisplayController"];
newVC.page = [self.pageFetchController.fetchedObjects objectAtIndex:(index)];
newVC.view.frame = CGRectMake(0, 0, 1024, 604);
NSLog(@"%i", index);
if(index == 0)
{
//We're moving to the first, animate the back button to be hidden.
[UIView animateWithDuration:0.5 animations:^
{ …Run Code Online (Sandbox Code Playgroud) 我正在为基于图画书的每个基页使用单独的.h,.m和.xib文件.每个页面都加载了动画,音乐等,并占用大约4MB的内存.在Instruments中,每个页面加载时,可用内存下降约4MB.翻页时,永远不会释放此内存.它最终会给出内存警告. 似乎保持每个页面在内存中实例化,并且不会卸载它.因此,当页面快速转动时,应用程序崩溃.UIViewControllerUIPageViewControllerUIPageViewController
我希望能够卸载除了UIPageViewController前一页,当前页和下一页所需的3页以外的所有页面.如何卸载不需要的页面,因为它们被实例化了UIPageViewController.
下面是UIPageViewController从中拉出的页面数组.所有页面(Page1,Page2等)基本上只是加载图像文件,提供基本动画和音乐.
//ARRAY OF PAGES
pageArray = [[NSArray alloc] initWithObjects:
(id)[[Page1 alloc] initWithNibName:nil bundle:nil],
[[Page2 alloc] initWithNibName:nil bundle:nil],
[[Page3 alloc] initWithNibName:nil bundle:nil],
[[Page4 alloc] initWithNibName:nil bundle:nil],
[[Page5 alloc] initWithNibName:nil bundle:nil],
[[Page6 alloc] initWithNibName:nil bundle:nil],
[[Page7 alloc] initWithNibName:nil bundle:nil],
[[Page8 alloc] initWithNibName:nil bundle:nil],
// continues all the way up to page 47
[[Page47 alloc] initWithNibName:nil bundle:nil],
nil];
Run Code Online (Sandbox Code Playgroud)
我遗漏了标准的初始化UIPageViewController.它使用" nextPageNumber"从pageArray上面拉出右页以创建新的页面对象. …
xcode memory-management ios automatic-ref-counting uipageviewcontroller
在我的应用程序中使用UIPageViewController时,我遇到了一些非常奇怪的行为.在第一次滑动到下一个视图时或者任何时候滑动方向改变(即在列表的末尾并返回),结果视图为空白,我需要再次滑动相同的方向以显示相应的视图.
3个视图的示例工作流程:
当发生眨眼时(上面的2和3),我注意到通过记录,事件的顺序如下:
然后当我再次滑动时,适当调用GetNextViewController并显示视图.
我的问题显然是,第二个视图应该显示没有闪烁的进出.我尝试了各种各样的东西,但没有任何成果.
UPDATE
这是一个示例单控制器应用程序,可以重现问题:
using System;
using System.Drawing;
using MonoTouch.Foundation;
using MonoTouch.UIKit;
using System.Collections.Generic;
namespace TestPageView
{
public partial class TestPageViewViewController : UIViewController
{
public TestPageViewViewController () : base ("TestPageViewViewController", null)
{
}
public override void DidReceiveMemoryWarning ()
{
// Releases the view if it doesn't have a superview.
base.DidReceiveMemoryWarning ();
// Release any cached data, images, etc that aren't in use.
} …Run Code Online (Sandbox Code Playgroud) 在刷过最后一个视图控制器后,如何解除/弹出UIPageViewController?基本上想要用图像制作教程样式的分页视图,并在用户从最后一页滑到"下一页"后解除.
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController {
NSUInteger index = [(EmailTutorialViewController *)viewController index];
index++;
if (index == 5) {
[self.navigationController popViewControllerAnimated:YES]; // this doesn't do anything
return nil;
}
return [self viewControllerAtIndex:index];
}
Run Code Online (Sandbox Code Playgroud) 我发现这两个UIPageViewControllerDataSource方法存在一个奇怪的问题:第一次进入页面视图控制器场景并拖动控制器的内容时,无论拖动方向是什么,都会调用两个数据源方法.我想当我在第一页并向右拖动时,这意味着在第一页之前没有更多的页面,这两种方法都不应该被调用.如果我向左拖动,只应调用after方法.
我按照这篇文章来设置视图控制器(除了我在故事板上没有单独的页面视图控制器.我使用传统[UIPAgeViewController alloc] init]方法来实例化控制器).以下是我的代码:
对于实际显示页面视图控制器内容的视图控制器(仅显示相关部分viewDidLoad):
- (void)viewDidLoad
{
// initialize page view controller
_pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];
self.pageViewController.delegate = self;
self.pageViewController.dataSource = self;
// set up the initial scene of the page view controller
UIViewController *viewController = [self viewControllerAtIndex:0];
[self.pageViewController setViewControllers:@[viewController]
direction:UIPageViewControllerNavigationDirectionForward
animated:NO
completion:nil];
// adjust the size of the page view controller, -44 to show the buttons at the bottom
self.pageViewController.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height - 44); …Run Code Online (Sandbox Code Playgroud) 我有三个控制器.一个,如果HomeViewController它启动它BlahPageViewController和它的个别页面.另外两个控制器(BlahPageViewController并专门BlahItemViewController处理UIPageViewController.在我HomeViewController,我有以下代码初始化页面.
private func setPageViewController() {
let blahPageController = self.storyboard!.instantiateViewControllerWithIdentifier("BlahPageController") as! BlahPageViewController
blahPageController.dataSource = self
blahPageController.blahs = blahs
if blahs.count > 0 {
let firstController = getItemController(0)!
let startingViewControllers: NSArray = [firstController]
blahPageController.setViewControllers(startingViewControllers as [AnyObject], direction: .Forward, animated: false, completion: nil)
}
// Setting page view controller to front of app
pageViewController = blahPageController
addChildViewController(pageViewController!)
self.view.addSubview(pageViewController!.view)
pageViewController!.didMoveToParentViewController(self)
// Now lets bring that container to the front.
self.view.bringSubviewToFront(self.headerBar)
// BUT …Run Code Online (Sandbox Code Playgroud) 目标:使视图控制器具有多个页面并且可以通过分段控制器进行交换,页面内容可以垂直滚动
细节:
我制作了一个pagviewcontroller并将其作为子视图嵌入到主视图控制器中
//add pageviewcontroller as subview to viewcontroller
if let vc = storyboard?.instantiateViewControllerWithIdentifier("ProfileEditController"){
self.addChildViewController(vc)
self.view.addSubview(vc.view)
EditTabs = vc as! UIPageViewController
EditTabs.dataSource = self
EditTabs.delegate = self
//define First page
EditTabs.setViewControllers([pagesAtIndexPath(0)!], direction:.Forward, animated: true, completion: nil)
EditTabs.didMoveToParentViewController(self)
//bring segmented view buttons to front of pageViews
self.view.bringSubviewToFront(self.topTabs)
}
Run Code Online (Sandbox Code Playgroud)我调用了pageViewController函数,我通过恢复标识符添加页面
我通过获取pageindex并设置viewcontroller来管理分段视图控制器,如下所示:
EditTabs.setViewControllers([pagesAtIndexPath(0)!], direction:.Reverse, animated: true, completion: nil)
Run Code Online (Sandbox Code Playgroud)在故事板中,子页面内部具有滚动视图以保存内容
我测试了子页面滚动视图,通过segue调用它并且工作正常
案件:
如何解决这个问题?我们非常感谢您的指导方针
谢谢,
我有一个UIPageViewController使用整数来告诉它在哪个页面.它工作正常,但如果用户快速滑动几次以进一步返回页面,整数变化的速度比视图更快,然后整个事情就会崩溃(应用程序认为它在第7页可能是显示第3页).我究竟做错了什么?我应该用不同的方法来判断我在哪里吗?谢谢.
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController {
if (pageNumber == 0) {
pageNumber++;
NSLog(@"%i", pageNumber);
Two *two = [[Two alloc] init];
return two;
} else if (pageNumber == 1) {
pageNumber++;
NSLog(@"%i", pageNumber);
Three *three = [[Three alloc] init];
return three;
} else if (pageNumber >= 2) {
return nil;
} else {
return nil;
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个TutorialsViewController,它以编程方式添加了PageViewController:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
// Create page view controller
self.pageViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"TutorialsPageViewController"];
self.pageViewController.dataSource = self;
TutorialsContentViewController *startingViewController = [self viewControllerAtIndex:0];
NSArray *viewControllers = @[startingViewController];
[self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil];
[self addChildViewController:self.pageViewController];
[self.view addSubview:self.pageViewController.view];
[self.pageViewController didMoveToParentViewController:self];
}
Run Code Online (Sandbox Code Playgroud)
我使用委托方法将TutorialsContentViewController添加到PageViewController:
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController {
NSUInteger index = ((TutorialsContentViewController*) viewController).pageIndex;
if ((index == 0) || (index == NSNotFound)) {
return nil;
}
index--;
return [self viewControllerAtIndex:index];
}
- (UIViewController …Run Code Online (Sandbox Code Playgroud) ios ×10
objective-c ×3
addsubview ×1
autolayout ×1
ios7 ×1
ipad ×1
iphone ×1
swift ×1
swift2 ×1
xamarin.ios ×1
xcode ×1