正如标题所说,我正在寻找一种方法来实现一个视图控制器,它以与Facebook Paper的通知/消息/朋友请求视图控制器相同的方式呈现。
我想要的是有一个图标(就像Facebook论文中的那个),当用户点击它时,一个新的视图控制器会以与纸张相同的动画方式弹出(因为我觉得那个很难再进一步研究那个动画=)
)。我希望它是一个视图控制器,因为它会做一些我希望分离的提升,这意味着UIView
实例不受欢迎。
有关如何滚动此类视图控制器的任何线索?
我猜测父控制器(显示所有新闻的控制器)实际上是一个UIContainerViewController
,它将孩子一个添加到自身,然后以特定方式动画它的视图。
我设法找到类似的东西 - WYPopoverController。这看起来像是朝着正确的方向射击,但需要一些额外的工作和抛光才能实现同样的效果和平滑度。如果需要,我可能会更深入地研究它,但希望你们可以拥有更好的东西。 :)
任何线索或线索都会非常感激。
PS。如果你有任何问题理解我的意思(比如你没有看过Paper),请在评论中告诉我,我也会在帖子中看到一些图片。
修改 Here is a video showing off the feature.如果你重播足够多次,整个动画就足够了。我不是在对图标的反弹(至少不是那么多)之后,因为我对这个过渡本身更感兴趣。如果需要,仍然可以提供更多照片。
答案 0 :(得分:0)
好的,我用日历做了类似的事情"弹出"您可以看到on my blog的类型视图。
这并不是你正在寻找的东西,但我认为你能够得到一个非常接近的匹配。
我在应用程序中使用了一个故事板,我制作了那个日历,所以我也会用故事板写这个。
首先,应用程序的日历部分使用全新的ViewController来管理它。这样做有两件事。
这意味着我可以将日历的代码与使用它的视图控制器的代码分开。这使它非常容易维护。如果日历需要修复,我在日历视图控制器中完成了。
它使日历非常容易在需要它的应用程序的任何部分使用。因为它在它自己的视图控制器中,我只需要呈现它,它可以在任何地方使用。
所以...我将如何做你的。
创建名为MyPopoverViewController
的视图控制器,并将其添加到Storyboard。现在从您想要呈现它的任何视图控制器创建一个模态segue。即使是按钮,如果这是你想要的。制作segue模态。并使它没有动画。
这样做会立即从当前的VC切换到MyPopoverVC
。
现在你需要.h文件中的几个属性。
@property (nonatomic, strong) UIView *backgroundView;
@property (nonatomic, assign) CGPoint startPoint;
现在,在调用它的VC中,你需要让你的prepareForSegue方法像这样......
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"myPopoverSegue"]) {
MyPopoverVC *controller = segue.destinationViewController;
controller.backgroundView = [self.view snapshotViewAfterScreenUpdates:NO];
controller.startPoint = // the position of the button that was pressed
}
}
现在设置弹出窗口视图控制器
首先,确保将backgroundView属性添加到self.view。
[self.view insertSubview:self.backgroundView atIndex:0];
还要确保backgroundView与屏幕尺寸相同。
或者您可以在故事板中执行此操作。它的作用是获取前一个视图控制器视图的快照,并将其放在新视图控制器的后面。这使得看起来popover出现在旧VC上,而实际上它只是一个截图。如果没有这个,新VC将具有纯黑色背景(或您设置的任何颜色)。
起点如何
在视图中,加载做了类似的事情......
- (void)viewDidLoad
{
...
self.theViewYouWantToBounce.frame = CGRectMake(self.startPoint.x, self.startPoint.y, 0, 0);
...
}
这会将它放在起始点(按钮所在的位置)并将其设置为零。
我假设您已关闭自动布局以保持简单。
好的,现在。在viewDidAppear
...
- (void)viewDidAppear
{
[super viewDidAppear];
[UIView animateWithDuration:0.5
delay:0.0
usingSpringDamping:1.0
initialSpringVelocity:1.0
options:0
animations:^{
self.theViewYouWantToBounce.frame = CGRectMake(//the end frame of the view
}
completion:nil];
}
您必须调整设置(阻尼,初始速度),但这会将视图从开始点的当前大小(0,0)反弹到您想要的大小和位置。
要隐藏它,只需在取消视图之前将动画恢复为零大小。
我希望这是有道理的。
要记住的事情。
希望这有帮助。