我最喜欢的侧抽屉控制器: https ://github.com/mutualmobile/MMDrawerController
MMDrawerController 是高度可配置的,并且可以完成您提到的所有事情:
- 支持左右控制器
- 预加载侧控制器
- 用手势“拖动”打开
如果您使用的是故事板,则可以使用此扩展来获得故事板支持:https ://github.com/TomSwift/MMDrawerController-Storyboard
编辑:
另一种选择可能是使用UIPageViewController
带有过渡样式的 a UIPageViewControllerTransitionStyleScroll
: https ://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 的行为而不是“提前翻页”和缓存视图控制器(如果这样做,我们的逻辑会混淆)。因此,您可能需要考虑一种更强大的机制来跟踪视图控制器当前位于哪一侧。为此,您可能必须引入自己的滑动手势识别器并使用其中的数据来驱动左/右跟踪。
如果您可以放弃对左右使用相同视图控制器的要求,那么您可以拥有单独的左/右/中心控制器,存储在一个数组中,并根据您在数组中看到的内容返回下一个/上一个控制器。更容易,更强大!