我试图学习UIPageViewController
s并找到一个我无法解决的问题.这就是我试图做的事情:
PageViewController
表现为一个dataSource
和delegate
自己.有没有人经历过这个?
@interface AMPageViewController : UIPageViewController <UIPageViewControllerDataSource, UIPageViewControllerDelegate>
@end
Run Code Online (Sandbox Code Playgroud)
实施:
#import "AMPageViewController.h"
@interface AMPageViewController ()
{
UIViewController *mainController;
UIViewController* socController;
}
@end
@implementation AMPageViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard"
bundle: nil];
mainController = (UIViewController*)[mainStoryboard instantiateViewControllerWithIdentifier: @"First"];
socController = (UIViewController*)[mainStoryboard …
Run Code Online (Sandbox Code Playgroud) objective-c uitextview uiviewcontroller uipageviewcontroller ios6
我正在使用页面视图控制器来翻阅一系列视图控制器,每个视图控制器都是从故事板中实例化的.我基本上使用基于标准页面的应用程序代码作为基础,并构建了我需要的东西.我正在翻阅的UITableViewController
视图控制器是包含自定义滚动视图的子类或自定义视图控制器.
页面视图控制器嵌入在导航控制器中,但是没有一个视图控制器遵循顶部布局指南,即使在我的自定义视图控制器的情况下约束被设置到故事板中的布局指南,我认为表视图控制器将自动管理它.我的意思是视图的内容从(0.0,0.0)开始,而不是用户可以看到的地方.唯一有效的是实际上将视图控制器视图的帧设置为在状态栏+导航栏下面开始,但我希望滚动视图在透明导航栏下滚动.
我做错了什么或不做什么?
presentationIndexForPageViewController返回值的文档说:
返回要在页面指示器中反映的所选项目的索引.
但是,这很模糊.当用户滚动浏览页面视图控制器时,它是否会调用此方法并期望正确的索引?
此外,还没有保证什么时候 pageViewController:viewControllerBeforeViewController:和pageViewController:viewControllerAfterViewController : . 文档刚提到:
响应于导航手势,[An]对象[提供]视觉控制器根据需要基于页面视图控制器.
事实上,我已经看到在某些情况下发生缓存.例如,如果您向前导航两个页面,它看起来只会被取消分配.否则,它希望将其保留在缓存中,以防用户在页面视图控制器中向后移动.
这是否意味着我需要一种一致的方式来通过注册作为UIPageViewControllerDelegate
然后不断更新此值来知道当前正在显示哪个页面?
我正在实现一个简单的图库视图控制器,其中应用程序显示用户可以滚动的一小部分全屏图像.我正在使用UIPageViewController,我认为,如果我实现了正确的数据源函数,它应该自动显示页面控制指示器.但是我仍然看不到任何指标.
在我的主要GalleryViewController
:
class GalleryViewController: UIViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate {
var pageController: UIPageViewController?
var pageContent = NSArray()
override func viewDidLoad() {
super.viewDidLoad()
.... some code to load images into the pageContent array ....
pageController = UIPageViewController(transitionStyle:.Scroll, navigationOrientation:.Horizontal,options:nil)
pageController?.delegate = self
pageController?.dataSource = self
... some more standard code to add the page controller to self.view etc.
var pageControl = UIPageControl.appearance()
pageControl.pageIndicatorTintColor = UIColor.lightGray()
pageControl.currentPageIndicatorTintColor = UIColor.whiteColor()
pageControl.backgroundColor = UIColor.blackColor()
pageController!.didMoveToParentViewController(self)
}
func viewControllerAtIndex(index:Int) -> ContentViewController? {
....
}
Run Code Online (Sandbox Code Playgroud)
我已经实现了两个必需的协议方法viewControllerBeforeViewController和viewControllerAfterController以及两个必需的分页方法,presentationCountForPagesViewController和presentationIndexForPageViewController.
我 …
我正在使用带有transitionStyle UIPageViewControllerTransitionStyleScroll
和navigationOrientation 的UIPageViewControllerUIPageViewControllerNavigationOrientationVertical
我也有一个UIPanGestureRecognizer
视图,我想在平移手势处于活动状态时禁用页面滚动.
我想在手势开始时设置以下内容:
pageViewController.view.userInteractionEnabled = NO;
Run Code Online (Sandbox Code Playgroud)
这似乎没有任何效果,或者似乎偶尔起作用.
我发现做它的唯一另一种方法(工作)是在平移手势运行时将UIPageViewController dataSource设置为nil,但这会在重置dataSource时造成巨大延迟.
所以,我有一个来自UICollecionView项目的segue被点击到UIPageViewController.当PageViewController显示时,导航栏显示为深灰色,其中的UIView具有奇怪的偏移量.但是,在屏幕上的任何地方点击一次后,我看到一个奇怪的"动画",UIView移动到正确的位置.因此,屏幕上的所有视图都会被移动.
以下是带有此错误的5秒视频链接:http://www.youtube.com/watch?v = CNbwBGvSzIk
PageViewController.m:
- (void)viewDidLoad
{
[super viewDidLoad];
self.title = [[[EVAEvent events] objectAtIndex:self.currentIndex] name];
self.dataSource = self;
self.delegate = self;
UIViewController *vc = [self viewControllerAtIndex:self.currentIndex];
NSArray *controllers = [NSArray arrayWithObjects:vc, nil];
[self setViewControllers:controllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];
}
- (UIViewController *)viewControllerAtIndex:(NSUInteger)index;
{
// NSLog(@"View Controller At Index = %lu", (unsigned long)self.currentIndex);
EVAEventInfoViewController *controller = [EVAEventInfoViewController getFromStoryboard];
EVAEvent *event = [[EVAEvent events] objectAtIndex:index];
[controller setIndex:index];
[controller setEvent:event];
return controller;
}
Run Code Online (Sandbox Code Playgroud)
EVAEventInfoViewController.m:
+ (EVAEventInfoViewController *) getFromStoryboard
{
//NSLog(@"Creating …
Run Code Online (Sandbox Code Playgroud) 我们设置了左右按钮,供用户快速浏览不同的汽车.如果用户快速点击下一页10次或更多次,我们的页面视图控制器将丢失视图控制器.
这是车辆正确显示的车辆页面(模糊以隐藏不相关的信息).见图:
如果滚动动画打开(true),则在快速点击右箭头6次或更多次后会丢失车辆页面.见图:
码:
private func show(viewController:UIViewController, going direction: UIPageViewControllerNavigationDirection) {
let viewControllers = [viewController]
let isAnimated = true // false always works. However, animation is required.
setViewControllers(viewControllers, direction: direction, animated: isAnimated, completion: nil)
}
Run Code Online (Sandbox Code Playgroud)
在调试时以及当页面视图控制器停止显示汽车时,我确保正在设置的视图控制器不是零并且列表(汽车)也是非零的.
我尝试了UIPageViewController的解决方案的变体,如何正确跳转到特定页面而不会弄乱数据源指定的顺序?使用完成块的位置.但是,它没有用.
weak var pvcw: UIPageViewController? = self
setViewControllers(viewControllers, direction: direction, animated: true, completion: {(_ finished: Bool) -> Void in
let pvcs: UIPageViewController? = pvcw
if pvcs == nil {
return
}
DispatchQueue.main.async(execute: {() -> Void in
pvcs?.setViewControllers(viewControllers, direction: direction, animated: …
Run Code Online (Sandbox Code Playgroud) 我有一个UIPageViewController
.一个页面只有一个按钮,另一个页面有UITextField
一个按钮.当页面滚动到带有字段的视图时,我想要它becomeFirstResponder
并打开键盘.这是发生的事情:
我调用了[self.locationQuery becomeFirstResponder]
ViewController的viewDidAppear
方法.但它永远不会打开键盘.
我做同样的事情viewWillAppear
,它看似简短,但后来很快就被解雇了.
如果我在带有文本字段的页面上,并将页面拉到中途并放开(不更改页面),则self.locationQuery
获得焦点就好了.
似乎其他东西正在从字段中获取firstResponder状态,但我不知道什么是什么,以及为什么它只会在页面发生变化时发生(而不是在页面转向失败后显示).有任何想法吗?
更新
我创建了一种方法来抓取视图以查看是否有任何其他视图确实采用firstResponder(来自此问题的答案:在不使用私有API的情况下获取当前的第一响应者).结果:
当我明确地将第一响应者提供给文本字段时,该方法报告它具有第一响应者状态.
当我不这样做时,它会返回null
.
现在我更加困惑.
我有一个显示不同页面的UIPageViewController.当前的行为是当我到达最后一页时它停止滚动.我现在想要实现的是,当在最后一页并向右滚动时,它会转到第一页.在第一页时,向左滚动时转到最后一页.所以基本上让PageViewController以圆圈形式显示页面.我的第一种方法在有多个页面或从一个页面开始时效果很好:
- (UIViewController*) pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(TMCollectionViewController *)viewController
{
if((viewController.pageIndex) >= 1)
{
return _viewControllers[viewController.pageIndex - 1];
}
else
{
if ([_viewControllers count] == 1) {
return nil;
}
return [_viewControllers objectAtIndex:[_viewControllers count]-1];
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我删除页面以便只剩下一个页面时,它仍然会记住页面之前或之后,并相应地显示它.即使数组中只剩下一页.任何帮助都非常感谢.
我正在创建一个页面视图应用程序.我已经编写了ViewController的代码:
import UIKit
class ViewController: UIViewController {
var pageViewController : UIPageViewController!
var pageTitles : NSArray!
var pageImages : NSArray!
@IBAction func restartAction(sender: AnyObject) {}
override func viewDidLoad() {
super.viewDidLoad()
self.pageTitles = NSArray(objects: "This Is Page One!", "This Is Page Two!")
self.pageImages = NSArray(objects: "page1", "page2")
self.pageViewController = self.storyboard?.instantiateViewControllerWithIdentifier("PageViewController") as! UIPageViewController
self.pageViewController.dataSource = self // <–– Error
let startVC = self.viewControllerAtIndex(0) as ContentViewController
let viewControllers = NSArray(object: startVC)
self.pageViewController.setViewControllers(viewControllers as? [UIViewController], direction: .Forward, animated: true, completion: nil)
self.pageViewController.view.frame = CGRectMake(0, 30, …
Run Code Online (Sandbox Code Playgroud) ios ×6
objective-c ×6
swift ×4
ios6 ×2
cocoa-touch ×1
ios7 ×1
iphone ×1
uitextview ×1
uiview ×1
xcode ×1