我最喜欢的侧边抽屉控制器是:https://github.com/mutualmobile/MMDrawerController
MMDrawerController非常灵活,可以完成您提到的所有功能:
- 支持左右两个控制器
- 预加载侧边控制器
- 使用手势“拖动”打开
如果您正在使用Storyboard,则可以使用此扩展程序来获得Storyboard支持:https://github.com/TomSwift/MMDrawerController-Storyboard
编辑:
另一个选项可能是使用UIPageViewController
并将转换样式设置为UIPageViewControllerTransitionStyleScroll
:https://developer.apple.com/library/ios/documentation/uikit/reference/UIPageViewControllerClassReferenceClassRef/UIPageViewControllerClassReference.html
这将具有“拉入”侧边视图控制器的行为,而不是“揭示”它们。
编辑2:根据要求提供示例
您唯一真正复杂的要求是相同的视图控制器用于左右两侧。这意味着我们必须跟踪视图控制器被呈现的位置,以便我们可以正确地管理我们的数据源。如果没有这个要求,我们可以使用数组来支持我们的数据源,并从中派生下一个/上一个。
首先是Storyboard。Storyboard有三个视图控制器:1)UIPageViewController
,我将其子类化为TSPageViewController
。不要忘记将页面控制器的转换样式属性设置为“滚动”。2)“中心”视图控制器,和3)“侧边”视图控制器。对于中心和侧边,我将每个的Storyboard ID分别设置为“center”和“side”。对于此示例,中心和侧面控制器都是普通的UIViewControllers
,我设置了它们的backgroundColor
以区分它们。
![enter image description here](https://istack.dev59.com/N9MlB.webp)
其次,页面视图控制器:
.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的行为来避免“提前分页”和缓存视图控制器(如果这样做,我们的逻辑将会混乱)。因此,您可能需要考虑更强大的机制来跟踪视图控制器当前所在的位置。为此,您可能需要引入自己的滑动手势识别器并使用其中的数据来驱动左/右跟踪。
如果您可以放弃使用相同的视图控制器作为左、右两侧,则可以拥有单独的左、右、中心控制器,存储在数组中,并根据数组中的内容返回下一个/上一个控制器。这样更容易且更健壮!