【发布时间】:2014-01-20 11:52:59
【问题描述】:
我有一个 UINavigationController (NC),其中包含一个 UITableViewController (TVC0)。当用户点击一行时,它会加载一个UIPageViewController (PVC),它会在其他UITableViewControllers (TVC1) 之间来回翻页。
TVC0 显示在 NC 内部(意味着它不会隐藏在顶部的导航栏或底部的标签栏后面)。当它推动 PVC 时,第一个 TVC1 出现在导航栏和标签栏的边界内。但是,当我滑动时,里面的 TVC1 隐藏在导航栏和标签栏后面。我可以拉动以显示内容,但当我松开时,它会弹回栏杆后面。
如何强制所有内容出现在两个栏之间?我不能使用故事板(因为它是一个旧版应用程序)并且嵌入... 选项不可用。
[编辑]
我添加了一些日志记录,发现我的嵌入式 TVC1s 帧的绝对原点为 0、64,但我一点击,它就变为 0、0。如果我无法找到真正的解决方案,我可以总是通过添加 64 来伪造它,但我更愿意弄清楚实际上是什么问题。
[/编辑]
[更多编辑]
我在 iOS 6 模拟器中测试了另一个区域,发现此分页在 iOS 6 中完美运行。所以我看到的问题是 iOS 7 特定的。
[/更多编辑]
这是我的 TVC0 viewDidLoad、PVC pageViewController:viewControllerBeforeViewController: 和一个助手 viewControllerAtIndex::
- (void) viewDidLoad
{
[super viewDidLoad];
NSDictionary* options = [NSDictionary dictionaryWithObject:
[NSNumber numberWithInteger: UIPageViewControllerSpineLocationMin]
forKey:
UIPageViewControllerOptionSpineLocationKey];
self.pageController = [[UIPageViewController alloc] initWithTransitionStyle:
UIPageViewControllerTransitionStyleScroll
navigationOrientation:
UIPageViewControllerNavigationOrientationHorizontal
options: options];
self.pageController.dataSource = self;
self.pageController.view.frame = self.view.frame;
NSArray* viewControllers =
[NSArray arrayWithObject: [self viewControllerAtIndex: self.initialIndex]];
[self.pageController setViewControllers: viewControllers
direction: UIPageViewControllerNavigationDirectionForward
animated: NO
completion: nil];
[self addChildViewController: self.pageController];
[self.view addSubview: self.pageController.view];
[self.pageController didMoveToParentViewController: self];
for (UIGestureRecognizer* recognizer in self.pageController.gestureRecognizers)
{
if ([recognizer isKindOfClass: [UITapGestureRecognizer class]])
{
recognizer.enabled = NO;
}
}
}
// SearchResultsList is TVC1
- (SearchResultsList*) viewControllerAtIndex: (NSUInteger) index
{
if (index >= self.items.count)
{
return nil;
}
SearchResultsList* retVal = [[SearchResultsList alloc]
initWithNibName: @"SearchResultsList" bundle: nil];
MyListItem* myItem = [self.items objectAtIndex: index];
MyMatchesRequest* matches = [[MyMatchesRequest alloc] initWithItemId: myItem.itemId];
[matches execute: ^(MySearchResults* results)
{
retVal.tableData = [NSMutableArray arrayWithArray: results.items];
retVal.view.frame = self.view.frame;
retVal.myItem = myItem;
retVal.index = index;
self.title = myItem.displayText;
[[retVal tableView] reloadData];
}];
return retVal;
}
- (UIViewController*) pageViewController: (UIPageViewController*) pageViewController
viewControllerBeforeViewController: (UIViewController*) viewController
{
SearchResultsList* vc = (SearchResultsList*)viewController;
if (vc.index == 0)
{
[self.navigationController popViewControllerAnimated: YES];
return nil;
}
return [self viewControllerAtIndex: vc.index - 1];
}
【问题讨论】:
-
每个视图控制器的自动布局是打开还是关闭?
-
@foundry:关闭。我尝试了两种方法,但没有任何帮助。
-
我遇到了完全相同的问题,我花了 +100 赏金,但我得到了它的工作:stackoverflow.com/questions/20258933/…。基本上尼克格拉索所说的有效。你在那个屏幕上也有一个 UINavigationBar 吗?如果您确实查看是否可以更改不透明度。如果它没有被看穿,它似乎也可以解决这个问题。
标签: ios uinavigationcontroller uitableview uipageviewcontroller