6

我正在构建一个适用于 iOS6+ 的应用程序。应用程序将在应用程序中的某一点有一个主视图控制器。

我希望这个主视图控制器能够处理向左滑动并在屏幕上向右滑动以显示另一个视图控制器。

有没有一种简单的方法可以在核心 iOS6+ 中实现这一点,或者我应该寻找另一个库等。

我已经在应用程序的其他地方使用了菜单样式的幻灯片。我也理解并且可以找到一百万种替代方法。

我正在寻找的是拥有一个视图控制器(它在“中间”起作用)。然后当他们向左/向右滑动时,会显示另一个视图控制器。然后他们可以向相反的方向向后滑动或单击后退按钮以返回主控制器。

编辑 - 具体来说
,我正在寻找执行以下操作的功能:预加载将滑入的控制器。当发生滑动时(正在发生)......控制器通过触摸拖动/滑入。无论以哪种方式滑动控制器(左/右),都会发生相同的拖动/滑动。

编辑 2 -
我正在寻找用手指拖动视图控制器的功能。根据拖动发生的方式,它将拉入相同的视图控制器。

即布局将是:[VC 拖动] [主控制器] [VC 拖动]。
如果用户从左向右或从右向左滑动,则另一个控制器被拖到顶部,他们可以使用相反的条目滑动返回主控制器。

4

5 回答 5

6

我最喜欢的侧抽屉控制器: https ://github.com/mutualmobile/MMDrawerController

MMDrawerController 是高度可配置的,并且可以完成您提到的所有事情:

  • 支持左右控制器
  • 预加载侧控制器
  • 用手势“拖动”打开

如果您使用的是故事板,则可以使用此扩展来获得故事板支持:https ://github.com/TomSwift/MMDrawerController-Storyboard

编辑:

另一种选择可能是使用UIPageViewController带有过渡样式的 a UIPageViewControllerTransitionStyleScrollhttps ://developer.apple.com/library/ios/documentation/uikit/reference/UIPageViewControllerClassReferenceClassRef/UIPageViewControllerClassReference.html

这将具有“拉”侧视图控制器与“发现”它们的行为。

编辑 2:每个请求的示例

您唯一真正复杂的要求是左右使用相同的视图控制器。这意味着我们必须跟踪视图控制器的呈现位置,以便我们能够正确管理我们的数据源。如果没有这个要求,我们可以只用一个数组来支持我们的数据源并从中派生下一个/上一个。

首先,故事板。故事板有三个视图控制器: 1) UIPageViewController,我将其子类化为TSPageViewController. 不要忘记将页面控制器转换样式属性设置为“滚动”。2)“中心”视图控制器,和 3)“侧面”视图控制器。对于中心和侧面,我将每个故事板的 ID 分别设置为“中心”和“侧面”。对于这个示例,中心控制器和侧控制器都是普通的 vanilla UIViewControllers,我设置了它们的 viewbackgroundColor来区分它们。

在此处输入图像描述

二、页面视图控制器:

。H

@interface TSPageViewController : UIPageViewController
@end

.m

@interface TSPageViewController () <UIPageViewControllerDataSource>
@end

@implementation TSPageViewController
{
    UIViewController* _side;

    UIViewController* _center;
}

- (void) viewDidLoad
{
    [super viewDidLoad];

    self.dataSource = self;

    _side = [self.storyboard instantiateViewControllerWithIdentifier: @"side"];
    _center = [self.storyboard instantiateViewControllerWithIdentifier: @"center"];

    [self setViewControllers: @[_center]
                   direction: UIPageViewControllerNavigationDirectionForward
                    animated: NO
                  completion: nil];
}

- (UIViewController*) pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
    if ( viewController == _center )
    {
        _side.title = @"right";
        return _side;
    }

    if ( viewController == _side && [_side.title isEqualToString: @"left"] )
    {
        return _center;
    }

    return nil;
}

- (UIViewController*) pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
    if ( viewController == _center )
    {
        _side.title = @"left";
        return _side;
    }

    if ( viewController == _side && [_side.title isEqualToString: @"right"] )
    {
        return _center;
    }

    return nil;
}

@end

同样,这里唯一特别的是跟踪侧控制器当前是“左”还是“右”。这个实现有一个问题,它依赖于 UIPageViewController 的行为而不是“提前翻页”和缓存视图控制器(如果这样做,我们的逻辑会混淆)。因此,您可能需要考虑一种更强大的机制来跟踪视图控制器当前位于哪一侧。为此,您可能必须引入自己的滑动手势识别器并使用其中的数据来驱动左/右跟踪。

如果您可以放弃对左右使用相同视图控制器的要求,那么您可以拥有单独的左/右/中心控制器,存储在一个数组中,并根据您在数组中看到的内容返回下一个/上一个控制器。更容易,更强大!

于 2013-10-21T22:33:35.223 回答
2

对于 iOS6+:

我倾向于使用https://github.com/pkluz/PKRevealController并将左右 viewControllers 设置为指向单个 viewController 的指针。


对于 iOS7+:

我认为您应该研究自定义 UIViewController 转换。

https://github.com/ColinEberhardt/VCTransitionsLibrary

http://www.teehanlax.com/blog/custom-uiviewcontroller-transitions/

关于这个主题有一个很好的 WWDC 2013 视频,题为“使用视图控制器的自定义转换”,它是第 218 节。

于 2013-10-23T15:36:09.030 回答
0

您可以使用一些可可控件来完成此操作,例如:

https://github.com/Inferis/ViewDeck

https://github.com/gotosleep/JASidePanels

编辑:建议二,使用带有滚动视图的控制器:

// Allocate all the controlelrs you need
MyFirstViewController *first = [[MyFirstViewController alloc] init];
MySecondViewController *second= [[MySecondViewController alloc] init];
MyThirdViewController *third = [[MyThirdViewController alloc] init];

// Adjust the frames of the controllers
first.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
second.view.frame = CGRectMake(0, self.view.frame.size.width, self.view.frame.size.width, self.view.frame.size.height);
third .view.frame = CGRectMake(0, 2 * self.view.frame.size.width, self.view.frame.size.width, self.view.frame.size.height);

// Add controllers as subViews to the scrollView
[self.scrollView addSubview:self.first.view];
[self.scrollView addSubview:self.second.view];
[self.scrollView addSubview:self.third.view];

// Set the scrollView contentSize and paging
self.scrollView.contentSize = CGRectMake(self.view.frame.size.width * 3, self.view.frame.size.height);
self.scrollView.pagingEnabled = YES;

// Scroll to the middle view initally
[self.scrollView scrollRectToVisible:CGRectMake(0, self.view.frame.size.width, self.view.frame.size.width, self.view.frame.size.height) animated:NO];

上面的代码是用心写的,我可能命名错了一些东西,处理子视图的方法不止一种。评论中提到的 pageViewController 也可以使用。

于 2013-10-21T22:27:34.873 回答
0

你要做的听起来很像苹果的 UIPageControl Demo的 iPhone 版本;

于 2013-10-27T15:49:40.287 回答
-1

听起来像是UISwipeGestureRecognizer的工作。

于 2013-10-12T13:38:42.123 回答