使用View的图层作为蒙版时,无法将子视图添加到UIView

时间:2014-02-20 18:49:55

标签: ios uiview core-animation calayer

我试图用一种类似于popover的效果来动画UIView,我希望UIView的背景能够将ios7风格模糊为背景。

使这个稍微复杂一点,我也希望能够通过拖动角落将变换应用于弹出窗口及其内容,就像在Facebook应用程序中聊天一样。

现在,我的方法基本上是这样的:获取窗口的模糊快照,添加UIImageView作为控制器视图的子视图,使用UIView popover屏蔽该imageView。然而,我发现我根本无法与UIView进行交互 - 子视图不显示,手势识别器不会触发等等。

这是我的代码:

UIWindow *mainWindow = [[UIApplication sharedApplication] keyWindow];
CGRect frame = [self.tableView.tableHeaderView convertRect:self.displayView.frame toView:self.view];

UIView *view = [UIView new];
view.frame = frame;
view.backgroundColor = [UIColor blackColor];
view.layer.cornerRadius = 10.f;
view.tag = 100;

//Take the snapshot
UIGraphicsBeginImageContextWithOptions(mainWindow.rootViewController.view.bounds.size, YES, [[UIScreen mainScreen] scale]);
[mainWindow drawViewHierarchyInRect:mainWindow.bounds afterScreenUpdates:NO];
UIImage *screenImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImage *blur = [screenImage applyDarkEffect];
UIImageView *imageView = [[UIImageView alloc] initWithImage:blur];
imageView.frame = self.view.bounds;

[self.view addSubview:imageView];
[self.view addSubview:view];

imageView.layer.mask = view.layer;

//Animate the view
    [UIView animateKeyframesWithDuration:1.4f delay:0.0f options:UIViewKeyframeAnimationOptionCalculationModeCubic
                              animations:^{
                                  [UIView addKeyframeWithRelativeStartTime:0.0 relativeDuration:0.75 animations:^{
                                      view.frame = CGRectInset(mainWindow.frame, 30, 40);
                                  }];
                                  [UIView addKeyframeWithRelativeStartTime:0.75 relativeDuration:0.05 animations:^{
                                      view.frame = CGRectInset(mainWindow.frame, 20, 30);
                                  }];
                                  [UIView addKeyframeWithRelativeStartTime:0.8 relativeDuration:0.20 animations:^{
                                      view.frame = CGRectInset(mainWindow.frame, 25, 35);
                                  }];
                              } completion:^(BOOL finished) {
                                  //This does nothing.
                                  UIView *test = [UIView new];
                                  test.frame = CGRectMake(100, 100, 100, 100);
                                  test.backgroundColor = [UIColor redColor];
                                  [view addSubview:test];
                              }];

有关为什么这不起作用的任何见解?或者替代方法?

我想到的另一种方法是滚动自己的关键帧动画:将imageView添加为“视图”的子视图,使用更新计时器,并计算每个帧的视图框架,从而抵消图像视图适当。但我希望能有一个更容易解决这个问题的方法。

0 个答案:

没有答案