DaN*_*aNY 6 containers screen-rotation uipageviewcontroller
我有一个包含其他ViewControllers的UIViewController.初始ViewController在viewDidLoad中设置:
FirstViewController *first = [FirstViewController alloc] init];
first.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
first.view.frame = m_content.frame;
[self addChildViewController:first];
[m_content.view addSubview:first.view];
[first didMoveToParentViewController:self];
m_activeViewController = first;
Run Code Online (Sandbox Code Playgroud)
此Container Controller已实现automaticForwardAppearanceAndRotationMethodsToChildViewControllers返回YES.它还实现了手动将旋转更改转发到非活动ViewControllers
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return YES;
}
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
for(UIViewController *vc in m_viewControllers)
{
if(vc != [m_activeViewController]
[vc willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
}
}
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
for(UIViewController *vc in m_viewControllers)
{
if(vc != [m_activeViewController]
[vc didRotateFromInterfaceOrientation:fromInterfaceOrientation];
}
}
Run Code Online (Sandbox Code Playgroud)
当点击菜单按钮时,我在ViewControllers之间进行转换.
- (void)onMenuItemTapped:(id)sender
{
UIViewController *vc = [m_viewControllers objectAtIndex:sender.tag];
vc.view.frame = m_content.frame;
[self addChildViewController:vc];
[self transitionFromViewController:m_activeViewController toViewController:vc duration:0 options:UIViewAnimationOptionTransitionNone animations:nil completion:^(BOOL finished) {
[vc didMoveToParentViewController:self];
[m_activeViewController removeFromParentViewController];
m_activeViewController = vc;
}];
}
Run Code Online (Sandbox Code Playgroud)
此转换适用于我的"普通"ViewControllers,它们在方向更改后正确显示,即使它们未处于活动状态.但是,其中一个名为SecondCV 的子视图控制器将UIPageViewController作为子视图控制器.我将UIPageViewControllerDelegate和UIPageViewControllerDataSource设置为此SecondCV并在pageViewController中:spineLocationForInterfaceOrientation:我为Portrait返回UIPageViewControllerSpineLocationMin,为Landscape返回UIPageViewControllerSpineLocationMid.此活动的旋转在活动时正常工作 - 横向上有两个页面,纵向模式上有一个页面正确显示.但是当此SecondVC未激活时,旋转不正确.即使调用了pageViewController:spineLocationForInterfaceOrientation : ,在纵向和横向模式下仍然有一个页面.我试图解决这个问题一段时间,但我没有看到任何其他选择.你有任何想法如何解决这个问题?
谢谢.
我已经解决了这种棘手的问题。
实际上,SecondVC 已正确旋转,或者至少,脊柱位置已正确更改。因此,当我旋转设备并且 SecondVC 在父视图中不是活动视图控制器时,它已收到旋转消息并且pageViewController:spineLocationForInterfaceOrientation:也被调用。我为新的界面方向设置了正确的书脊位置,并将setViewControllers调用到 SecondVC 的页面视图控制器。问题是,即使我为UIPageViewControllerSpineLocationMid设置两个视图控制器,在显示 SecondVC 后仍然只有一个,就像 UIPageViewControllerSpineLocationMin 中一样。
我已经“修复”了这个问题,通过将视图控制器设置为viewWillAppear:中的页面视图控制器,因为当调用此方法时,页面视图控制器的书脊位置是正确的,并且根据此信息我设置了一个或两个页面(视图控制器)
- (void)viewWillAppear:(BOOL)animated
{
if(m_pageController.spineLocation == UIPageViewControllerSpineLocationMid)
{
LeftPageController *left;
RightPageController *right;
if(m_pageController.viewControllers.count > 0)
{
left = [m_pageController.viewControllers objectAtIndex:0];
right = [m_storyboard instantiateViewControllerWithIdentifier:@"rightPage"];
[right loadView];
}
[m_pageController setViewControllers:[NSArray arrayWithObjects:left, right, nil] direction:UIPageViewControllerNavigationDirectionForward | UIPageViewControllerNavigationDirectionReverse animated:NO completion:nil];
[m_left hideGallery];
}
if(m_pageController.spineLocation == UIPageViewControllerSpineLocationMin)
{
[m_pageController setViewControllers:[NSArray arrayWithObject:[m_pageController.viewControllers objectAtIndex:0]] direction:UIPageViewControllerNavigationDirectionForward | UIPageViewControllerNavigationDirectionReverse animated:NO completion:nil];
}
[super viewWillAppear:animated];
}
- (UIPageViewControllerSpineLocation)pageViewController:(UIPageViewController *)pageViewController spineLocationForInterfaceOrientation:(UIInterfaceOrientation)orientation
{
if(UIInterfaceOrientationIsPortrait(orientation))
{
LeftPageController *left = [pageViewController.viewControllers objectAtIndex:0];
[pageViewController setViewControllers:[NSArray arrayWithObject:left] direction:UIPageViewControllerNavigationDirectionForward | UIPageViewControllerNavigationDirectionReverse animated:NO completion:nil];
pageViewController.doubleSided = NO;
return UIPageViewControllerSpineLocationMin;
}
if(UIInterfaceOrientationIsLandscape(orientation))
{
LeftPageController *left;
RightPageController *right;
if(pageViewController.viewControllers.count > 0)
{
left = [pageViewController.viewControllers objectAtIndex:0];
right = [m_storyboard instantiateViewControllerWithIdentifier:@"rightPage"];
[right loadView];
}
[pageViewController setViewControllers:[NSArray arrayWithObjects:left,right, nil] direction:UIPageViewControllerNavigationDirectionForward | UIPageViewControllerNavigationDirectionReverse animated:NO completion:nil];
return UIPageViewControllerSpineLocationMid;
}
return UIPageViewControllerSpineLocationMin;
}
Run Code Online (Sandbox Code Playgroud)
我知道我做了两次同样的事情,但这就是我在这种情况下愿意付出的代价。为什么在调用pageViewController:spineLocationForInterfaceOrientation:并为 Landscape 设置两个视图控制器后,当 SecondVC 处于非活动状态时,激活 SecondVC 后,在viewWillAppear:中的 m_pageController 中只有一个 ViewController对我来说仍然是个谜。
| 归档时间: |
|
| 查看次数: |
3561 次 |
| 最近记录: |