【问题标题】:Handling a view controller that slides in with either way swipe处理通过任一方式滑动滑入的视图控制器
【发布时间】:2013-10-12 13:31:18
【问题描述】:

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

我希望这个主视图控制器能够在屏幕上向左滑动和向右滑动,然后显示另一个视图控制器。

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

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

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

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

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

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

【问题讨论】:

    标签: ios ios6 uiview uiviewcontroller


    【解决方案1】:

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

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

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

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

    编辑:

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

    这将具有在侧视图控制器中“拉动”而不是“发现”它们的行为。

    编辑 2:每个请求的示例

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

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

    二、页面视图控制器:

    .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 的行为而不是“提前页面”和缓存视图控制器(如果这样做,我们的逻辑会混淆)。因此,您可能需要考虑一种更强大的机制来跟踪视图控制器当前位于哪一侧。为此,您可能必须引入自己的滑动手势识别器,并使用其中的数据来驱动左/右跟踪。

    如果您可以放弃对左右使用相同视图控制器的要求,那么您可以拥有单独的左/右/中心控制器,存储在一个数组中,并根据您在大批。更简单、更强大!

    【讨论】:

    • 我认为这对于手头的任务来说有点矫枉过正。我浏览了一堆视图控制器中的幻灯片,并实际上将其中一个用于应用程序中的菜单系统。我只是在寻找加载主控制器的能力,然后在“下方”有第二个控制器,当用户向左或向右拖动/滑动时显示。然后当他们以相反的方式向后滑动时,主控制器再次显示。这不是我可以简单地实现的东西,而不是菜单样式的 git 中的每一个幻灯片提供的不同路线。
    • 这对我来说似乎并不过分。您所描述的是这些控制器的设计目的。您可以自己滚动,但为什么呢?
    • Tom 我想实施这种方法,但我在如何实施这种方法方面遇到了困难,您还有其他信息吗?我正在使用情节提要,并且将设置两个控制器。一个用于主控制器,另一个控制器可以从任一侧拉入。我不确定如何设置它,因为 Apple 示例使用 DataSource 等,而这是一种简单的 UIViewController 方法。有关像这样设置的任何其他信息或有用的链接。
    • @StuartM - 我已经为你添加了一个示例。祝你好运!
    • 太好了,谢谢汤姆,这正是我想要的。太好了,我不需要实施任何第三方来完成这项工作——甚至更好!
    【解决方案2】:

    对于 iOS6+:

    我倾向于使用https://github.com/pkluz/PKRevealController 并将左右视图控制器都设置为指向单个视图控制器的指针。


    对于 iOS7+:

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

    https://github.com/ColinEberhardt/VCTransitionsLibrary

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

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

    【讨论】:

    • 这些是针对iOS7+的,我的目标是iOS6
    • 对不起,错过了。上面编辑的答案。
    【解决方案3】:

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

    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];
    

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

    【讨论】:

    • 这些只是滑入式菜单控制器。事实上,我已经在我的应用程序中使用了一个。我正在特别寻找能够从两侧进行拖动/滑动的能力,因此考虑手动创建此功能或执行此功能的特定示例。我已经经历了大约 50 次。
    • 那么为什么不使用简单的滚动视图和分页呢?
    • 我不明白为什么这不起作用?你有任何关于如何设置这些的例子吗,我可以设置分页但没有图标来指示这一点。我只需要在中间加载一个主控制器,并且能够从左侧或右侧拖动“下方”VC,然后从最初拖动的相反方向返回到中间
    • 只需使用 scrollView 制作一个 viewController(它甚至可以是您的中心控制器或任何其他控制器),将其他控制器的视图与调整后的框架添加为子视图并以编程方式滚动到中间的视图。我会用一些示例代码更新答案。
    • 与其滚动自己的 UIScrollView 解决方案,不如使用 UIPageViewController。 developer.apple.com/library/ios/documentation/uikit/reference/…
    【解决方案4】:

    您要执行的操作听起来很像 iPhone 版本的Apple's UIPageControl Demo

    【讨论】:

      【解决方案5】:

      听起来像是UISwipeGestureRecognizer 的工作。

      【讨论】:

      • 我猜问题出在情节提要中视图控制器的布局上。它们将如何布置。如果我想要滑动来加载相同的控制器。理想情况下,我正在寻找一种方法来滑动并“拖动”新的 VC,手指仍然向下,所以它会拖进来。两者都用于滑动。
      猜你喜欢
      • 2014-11-02
      • 1970-01-01
      • 2015-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多