当用户点击行时,表格视图在导航栏下滑动

我有一个UINavigationController (NC)包含一个UITableViewController (TVC0)。 当用户点击一行时,它会加载一个UIPageViewController (PVC),它在其他UITableViewController (TVC1)之间来回切换。

TVC0显示在NC内部(意味着它不隐藏在顶部的导航栏或底部的标签栏后面)。 当它推动PVC时,第一个TVC1出现在导航栏和标签栏的边界内。 但是,当我滑动,里面的TVC1s隐藏在导航栏和标签栏后面。 我可以拉来揭示内容,但是当我释放时,它会回到酒吧后面。

我怎么能强迫一切出现在两个酒吧之间? 我不能使用故事板(因为它是一个传统的应用程序)和embedded…选项不可用。

[编辑]

我添加了一些日志logging,发现我的embedded式TVC1帧的绝对原点为0,64,但是一旦我点击,它就会变为0,0。如果我找不出一个真正的解决scheme,我总是可以伪造它通过加64,但我更想知道什么是错的。

[/编辑]

[更多编辑]

我正在testingiOS 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]; } 

因为您正在将视图控制器呈现在小于您需要设置的全屏大小的容器中

 self.pageViewController.definesPresentationContext = YES; viewControllerWhichIsApageInPageController.modalPresentationStyle = UIModalPresentationCurrentContext 

我有一个非常痛苦的类似的行为学习经验:(

把它放在你的视图控制器的init中:

 self.automaticallyAdjustsScrollViewInsets = NO; 

这是一个新的UIViewController属性,在iOS 7中默认为YES

UIViewController文件

你的代码似乎有点困惑。 你说这是你的页面视图控制器的viewDidLoad ,但它创build一个新的PVC,并将其作为子视图控制器添加到自己作为父项。 如果你真的这样做,你正在另一个PVC内创build一个PVC。 我怀疑这是你想要的。

这个代码真的属于TVC0,当用户点击一行时调用PVC。 这个调用在viewDidLoad是不正确的,但是可以很好地放在didSelectRowAtIndexPath方法中。 我们可以简单地将它推到我们的navigationController的栈中,而不是把它作为子控制器来使用。 (我希望你在最外层的PVC里这么做)。

但为了以防万一,我会删除这三行:

  [self addChildViewController: self.pageController]; [self.view addSubview: self.pageController.view]; [self.pageController didMoveToParentViewController:self]; 

并replace它们

  [self.navigationController pushViewController:self.pageController animated:YES]; 

(这是从你的TVC0中调用的 – 你所显示的所有代码都可以存在于TVC0中)

然后为了防止你描述的行为,当你创build你的UINavigationController ,只需要将它的navigationBartranslucent属性设置为NO即可。

更新

我已经仔细查看了这个问题,看到某些情况下出现的一些错误行为,但是很难复制。

“跳跃”行为的原因很明显。 如果你有一个半透明的navBar, 并且automaticallyAdjustsScrollViewInsets将AdjustsScrollViewInsets设置为YES,在某些情况下,这可能会导致pageViewController( _UIQueuingScrollView )的一个私有子视图,当pageViewController第一次加载时,它将contentOffset.y设置为-64。 然而,只要页面VC有机会更新自己(例如通过轻扫或其他触摸手势),就会重置它的内部子视图状态,从而失去了stream氓contentOffset。 所以当你触摸第一页时,它会跳起来。 那里停留。 这可能被认为是一个错误,虽然它可能是滥用pageViewController的结果。

只需将automaticallyAdjustsScrollViewInsets调整ScrollViewInsets设置为NO不会消除您的问题,因为您的页面都位于navBar后面。 你需要做的是调整pageViewController本身的框架。

我可以介绍更多的细节,但是在这个时候,很难将具体案例的答案应用到您的应用程序devise中,这可能会导致问题。

  • 如果您可以将导航控制器的导航栏的translucent属性设置为NO,则问题应该消失。

  • 正如我前面提到的那样,我无法完全按照您所描述的来复制您的问题,所以我认为您还没有完整清楚地了解您的应用程序devise

  • 加载一个pageViewController作为一个tableViewController的子元素,并使其视图的子视图的tableView,是一个非常奇怪的方式去,无疑是造成你的问题。

  • viewControllerBeforeViewController pageViewController的孩子似乎popup它的parentViewController(tableViewController) – 所以你永远不会看到它的表内容? 要么有更多的相关细节的应用程序,或者你没有准确描述它。

我build议你先处理这些问题。 你的问题可能会消失。