“一个”视图中的多个UIViewControllers

时间:2014-07-04 07:47:17

标签: ios objective-c uiviewcontroller views

我正在创建一个应用程序,我有多个不同的屏幕可以执行不同的操作。我把它全部用在UINavigationController中的pop / push。

布局就是这样的。灰色是每个" uiviewcontroller",矩形是背景图片的一部分,RGB是'内容'在每个uiviewcontroller中。

img1

我想让所有不同的屏幕看起来都在同一个空间"。喜欢下一张图片。

我一直在玩自定义赛段,而且"有点"作品。它删除了" push" /" pop"视觉和动画都很流畅,如果背景是一种颜色,它的效果很好。但情况并非如此,实际上我的背景会有一个动画,它旋转的速度非常慢。

img2

那我该怎么办呢?

我尝试或想过的事情

  1. 自定义segues。需要大量繁琐的动画,不确定我是否应该追求它,因为它看起来像是一个黑客(例如我现在分别为背景设置动画,使其看起来像RGB(内容)移动时静止。)
  2. 过渡,我只是看了这个,但如果我没有弄错,它将会遇到与上述相同的问题。
  3. 将3个UIViewControllers添加到UIScrollView(或类似)中的某种方式,并以某种方式"更改"活跃的UIViewController / delegate /取决于我当前正在观看的屏幕。
  4. 每个RGB都是它自己的UIView,由一个大的UIViewController管理。
  5. 我已经在这个问题上待了好两天,但我不确定如何最好地解决这个问题。

    编辑:我使用了下面的UIPageViewController解决方案,这是结果" app"。

    result

3 个答案:

答案 0 :(得分:1)

您是否尝试过使用UIPageViewController?如果你想用滑动手势改变UIViewController,它就是答案。它'可从iOS 6获得。

RootVC.h

@interface RootVC : UIPageViewController
@end

RootVC.m

@interface RootVC () <UIPageViewControllerDelegate, UIPageViewControllerDataSource>
{
    NSArray *_viewControllers;
}
@end

@implementation RootVC

- (void)viewDidLoad
{
    [super viewDidLoad];

    LeftViewController *lv = [[LeftViewController alloc] init];
    CenterViewController *cv = [[CenterViewController alloc] init];
    RightViewController *rv = [[RightViewController alloc] init];
    _viewControllers = @[lv, cv, rv];

    [self setViewControllers:@[cv] direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:^(BOOL finished) {

}];
[self setDelegate:self];
[self setDataSource:self];

}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
    NSInteger index = [_viewControllers indexOfObject:viewController];
    if(index > 0)
    {
        index--;
        return [_viewControllers objectAtIndex:index];
    }
    else
    {
        return nil;
    }
}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
    NSInteger index = [_viewControllers indexOfObject:viewController];
    if(index < 2)
    {
        index++;
        return [_viewControllers objectAtIndex:index];
    }
    else
    {
        return nil;
    }
}

答案 1 :(得分:0)

您是否尝试将视图控制器放在容器视图中?也许它会满足你的需求。

https://developer.apple.com/videos/wwdc/2011/?id=102

答案 2 :(得分:0)

您不需要三个UIViewControllers。

  1. 将三个UIView子对象添加到UIViewController的UIView中, 调整frame.origin.x为每个(所以他们在屏幕上 或不)。
  2. 为您的UIViewController添加滑动手势识别器 右+左,
  3. 然后在触发时,根据需要在屏幕上或屏幕外移动视图。您可以使用标准的UIView AnimateWithDuration方法或更自定义的CAAnimation。