iOS Facebook论文就像popover视图控制器

时间:2014-07-14 19:43:01

标签: ios iphone objective-c facebook uiviewcontroller

正如标题所说,我正在寻找一种方法来实现一个视图控制器,它以与Facebook Paper的通知/消息/朋友请求视图控制器相同的方式呈现。

我想要的是有一个图标(就像Facebook论文中的那个),当用户点击它时,一个新的视图控制器会以与纸张相同的动画方式弹出(因为我觉得那个很难再进一步研究那个动画=))。我希望它是一个视图控制器,因为它会做一些我希望分离的提升,这意味着UIView实例不受欢迎。

有关如何滚动此类视图控制器的任何线索? 我猜测父控制器(显示所有新闻的控制器)实际上是一个UIContainerViewController,它将孩子一个添加到自身,然后以特定方式动画它的视图。

我设法找到类似的东西 - WYPopoverController。这看起来像是朝着正确的方向射击,但需要一些额外的工作和抛光才能实现同样的效果和平滑度。如果需要,我可能会更深入地研究它,但希望你们可以拥有更好的东西。 :)

任何线索或线索都会非常感激。

PS。如果你有任何问题理解我的意思(比如你没有看过Paper),请在评论中告诉我,我也会在帖子中看到一些图片。

修改 Here is a video showing off the feature.如果你重播足够多次,整个动画就足够了。我不是在对图标的反弹(至少不是那么多)之后,因为我对这个过渡本身更感兴趣。如果需要,仍然可以提供更多照片。

1 个答案:

答案 0 :(得分:0)

好的,我用日历做了类似的事情"弹出"您可以看到on my blog的类型视图。

这并不是你正在寻找的东西,但我认为你能够得到一个非常接近的匹配。

我在应用程序中使用了一个故事板,我制作了那个日历,所以我也会用故事板写这个。

首先,应用程序的日历部分使用全新的ViewController来管理它。这样做有两件事。

  1. 这意味着我可以将日历的代码与使用它的视图控制器的代码分开。这使它非常容易维护。如果日历需要修复,我在日历视图控制器中完成了。

  2. 它使日历非常容易在需要它的应用程序的任何部分使用。因为它在它自己的视图控制器中,我只需要呈现它,它可以在任何地方使用。

  3. 所以...我将如何做你的。

    创建名为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)反弹到您想要的大小和位置。

    要隐藏它,只需在取消视图之前将动画恢复为零大小。

    我希望这是有道理的。

    要记住的事情。

    1. 在新的视图控制器中执行此操作。
    2. 假装它看起来像是在同一个VC中(使用快照)。
    3. 使视图在起点处非常小。
    4. 在视图上确实显示为您想要的大小。
    5. 希望这有帮助。