测试已测试 | ✗ |
语言语言 | Objective-CObjective C |
许可证 | MIT |
已发布最新发布 | 2017年9月 |
由 Marian Paul 维护。
这是一个新的控制器容器,像 Facebook 或 Path 应用一样显示侧边视图。它使用起来与导航控制器一样简单。有时,您需要推入一个新的控制器来显示一些选项,但一个小的控制器就足够了……PPRevealSideViewController 就是您需要的控制器。
包括拖放和点击手势!
安装 PPRevealSideViewController 的最简单方法是通过 CocoaPods 包管理器,因为它非常灵活,且提供轻松的安装方式。
$ cd /path/to/MyApplication
# If this is a new project, initialize git...
$ git init
$ git submodule add git://github.com/ipup/PPRevealSideViewController.git vendor/PPRevealSideViewController
$ git submodule update --init --recursive
PPRevealSideViewController 完全支持 ARC 和非 ARC 模式,无需配置。这对于您有旧项目或不想使用 ARC 的情况来说非常方便。ARC 支持已与 Apple LLVM 3.0 编译器进行了测试。
这个类完全兼容 iOS 7。我最近停止支持之前的版本。所以如果需要,请获取比 这一版本更早的提交/版本。
PPReveal 支持状态保留和恢复。您只需要设置所有希望恢复的控制器上的 restorationIdentifier
,也许还有 restorationClass
,然后您就设置好了。
状态栏样式和隐藏会被传递到子控制器。如果您想移除这个行为,只需从 PPReveal 派生一个子类并重写两者 childViewControllerForStatusBarStyle
和 childViewControllerForStatusBarHidden
以返回 nil
。
这个类已有文档说明。您可以浏览到文档/html文件夹,然后打开index.html(或者在网络上找到它:[http://ipup.github.com/PPRevealSideViewController](http://ipup.github.com/PPRevealSideViewController) 或者在 Xcode 中安装文档集合。
有两个示例代码
两种方法:1. 前往 Xcode,偏好设置,下载,然后输入以下馈送网址:[http://ipup.github.com/PPRevealSideViewController/PPRevealSideViewController.atom](http://ipup.github.com/PPRevealSideViewController/PPRevealSideViewController.atom)
2. 按照以下步骤操作
如果您想创建文档,在运行此目标之前,您需要安装 AppleDoc:[https://github.com/tomaz/appledoc](https://github.com/tomaz/appledoc)
在某个地方创建控制器,例如在您的应用程序代理中,动态分配并初始化控制器
_revealSideViewController = [[PPRevealSideViewController alloc] initWithRootViewController:rootController];
然后,将其添加到窗口中
self.window.rootViewController = _revealSideViewController;
或将它添加到一个视图中
[self.view addSubview:_revealSideViewController.view];
您可以在顶部添加一个导航控制器,例如
MainViewController *main = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:main];
_revealSideViewController = [[PPRevealSideViewController alloc] initWithRootViewController:nav];
self.window.rootViewController = _revealSideViewController;
您有多种推入控制器的方式(参见文档或示例),最简单的方式是
PopedViewController *c = [[PopedViewController alloc] initWithNibName:@"PopedViewController" bundle:nil ];
[self.revealSideViewController pushViewController:c onDirection:PPRevealSideDirectionBottom animated:YES];
这将在底部推入控制器,并使用默认偏移。您有四个方向
PPRevealSideDirectionBottom
PPRevealSideDirectionTop
PPRevealSideDirectionLeft
PPRevealSideDirectionRight
要从侧边控制器返回中心控制器,您可以弹出
[self.revealSideViewController popViewControllerAnimated:YES];
如果您想弹出新的中心控制器,请按照以下操作
MainViewController *c = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil];
UINavigationController *n = [[UINavigationController alloc] initWithRootViewController:c];
[self.revealSideViewController popViewControllerWithNewCenterController:n animated:YES];
如果您只想在左侧和右侧呈现控制器(例如),您可能不希望有弹动动画来显示尚未呈现控制器。这种动画出现在您进行一个在没有任何预加载数据的控制器上或尚未在该触发侧推入任何控制器的拖动手势时。在这种情况下,请按照以下操作
[self.revealSideViewController setDirectionsToShowBounce:PPRevealSideDirectionLeft | PPRevealSideDirectionRight];
您也可以完全禁用这些动画。按照如下操作禁用
[self.revealSideViewController setDirectionsToShowBounce:PPRevealSideDirectionNone];
例如,如果您在顶部,并且希望向左侧推入一个控制器,您可能需要在您的中心控制器上调用一个方法请求它显示一个左侧控制器。但我认为提供一种直接推入旧控制器的路径会更方便。因此,使用以下方法将完成这项任务
[self.revealSideViewController pushOldViewControllerOnDirection:PPRevealSideDirectionLeft animated:YES];
如果您在顶部,并希望将新控制器推入顶部(为什么不呢),控制器默认行为是关闭顶部侧边,因为它已经打开。但您可以强制它弹出推入
[self.revealSideViewController pushViewController:c onDirection:PPRevealSideDirectionTop animated:YES forceToPopPush:YES];
您可以完全打开一个侧面(以 Facebook 应用在您点击搜索栏时的例子)。当您在一个打开的侧面
[self.revealSideViewController openCompletelyAnimated:YES];
或者当你想从中心控制器打开(想想预先加载控制器)时
[self.revealSideViewController openCompletelySide:PPRevealSideDirectionLeft animated:YES];
调用 PPRevealSide 方法的每一次,如推送或弹出,都可以与完成块配合使用
PopedViewController *c = [[PopedViewController alloc] initWithNibName:@"PopedViewController" bundle:nil ];
[self.revealSideViewController pushViewController:c onDirection:PPRevealSideDirectionBottom withOffset:_offset animated:_animated completion:^{
PPRSLog(@"This is the end!");
}];
是的,这是 iOS 7 上的状态栏。好吧,你现在有两个选项(淡入设置为默认)。PPRevealSideOptionsiOS7StatusBarFading
和 PPRevealSideOptionsiOS7StatusBarMoving
试试它们!(使用 setOption:
)
请注意,如果您想在使用淡入选项时改变状态栏的背景颜色,请改变 fakeiOS7StatusBarColor
的值(默认为黑色)。
[self.revealSideViewController resetOption:PPRevealSideOptionsiOS7StatusBarFading];
[self.revealSideViewController setOption:PPRevealSideOptionsiOS7StatusBarMoving];
默认情况下,边侧视图没有加载。这意味着即使你的界面有一个按钮用来推送一个侧视图,平移手势也不会显示出控制器。如果你想那样,你需要预先加载你想要展示的控制器。
TableViewController *c = [[TableViewController alloc] initWithStyle:UITableViewStylePlain];
[self.revealSideViewController preloadViewController:c
forSide:PPRevealSideDirectionLeft
withOffset:_offset];
请注意,当使用预先加载方法时,如果你从同一侧弹出中心控制器,可能会存在一些干扰……出于这个原因,我强烈建议你推迟预先加载方法。例如
- (void) viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(preloadLeft) object:nil];
[self performSelector:@selector(preloadLeft) withObject:nil afterDelay:0.3];
}
如有需要,你还有一个卸载方法。当一个标签栏控制器作为你的边侧视图控制器的根时,这很有用。第一个项目可以有左侧,但第二个项目则不行!
- (void) unloadViewControllerForSide:(PPRevealSideDirection)direction;
如果你有一些已经配置了平移手势的视图,你有一些选择。记住,例如对于 UIWebView,最好的做法是将宽度适应屏幕,并禁用缩放。这通常是在一个移动感知网页上所做的。
禁用内容视图上的平移手势
self.revealSideViewController.panInteractionsWhenClosed = PPRevealSideInteractionNavigationBar; self.revealSideViewController.panInteractionsWhenOpened = PPRevealSideInteractionNavigationBar;
实现代理方法
(PPRevealSideDirection)pprevealSideViewController:(PPRevealSideViewController *)controller directionsAllowedForPanningOnView:(UIView *)view {
if ([view isKindOfClass:NSClassFromString(@"UIWebBrowserView")]) return PPRevealSideDirectionLeft | PPRevealSideDirectionRight;
return PPRevealSideDirectionLeft | PPRevealSideDirectionRight | PPRevealSideDirectionTop | PPRevealSideDirectionBottom; }
在没有控制器的所有边上,你也可以禁用弹跳动画来显示没有控制器。
你现在有一个很好的方法可以替换中心控制器(感谢xOr-developer)
SecondViewController *c = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
[self.revealSideViewController replaceCentralViewControllerWithNewController:c animated:YES animationDirection:PPRevealSideDirectionLeft completion:^{
PPRSLog(@"Poped with new controller");
}];
你在 PPRevealSideOptions 中可以找到以下一些可用的选项
这个控制在这个我们的 iPuP 开发的应用中使用
请随意PR说明文档以添加您的应用!
对于有完成块的方法 xOr-developer iOS 7中切换状态栏 cvknage
非常感谢他们!
此代码由 Marian Paul 代表 iPuP SARL 根据 MIT 许可证发布。
当您在项目中使用此控制器时,请通知我!
祝好,
Marian Paul 亦称 ipodishima