从屏幕外设置自定义UIView的动画使其子视图无响应

时间:2017-01-20 12:08:42

标签: ios objective-c uiview

我创建了一个带有UILabel和UIButton的小型自定义UIView,这个自定义视图是一个显示在当前视图控制器顶部的横幅。

我从nib文件加载视图布局,并使用自定义视图中的方法显示动画,并且视图将在特定时间后隐藏。像这样。

- (void)displayBannerInViewController:(UIViewController *)vc
{
  CGFloat originY = 0;
  if (vc.navigationController != nil) {
    originY += 20 + vc.navigationController.navigationBar.bounds.size.height - self.bounds.size.height;
  }
  self.frame = CGRectMake(0,
                      originY,
                      [UIScreen mainScreen].bounds.size.width,
                      self.bounds.size.height);

  if (vc.navigationController != nil) {
    [vc.navigationController.view insertSubview:self atIndex:1];
  } else {
    [vc.view.window insertSubview:self atIndex:1];
  }

  [UIView animateWithDuration:0.3 animations:^{
    self.frame = CGRectOffset(self.frame, 0, self.bounds.size.height);
  } completion:^(BOOL finished) {

    [UIView animateWithDuration:0.3 delay:self.duration options:0 animations:^{
      self.frame = CGRectOffset(self.frame, 0, -self.bounds.size.height);
    } completion:^(BOOL finished) {
      if (finished) {
        [self removeFromSuperview];
      }
    }];
  }];
}

我使用此

为横幅内的按钮设置了操作
[self.actionButton addTarget:self
                        action:@selector(executeActionBlock)
              forControlEvents:UIControlEventTouchUpInside];

在显示横幅的动画之后,隐藏之前,无论我点击按钮多少次,都不会调用executeActionBlock方法。

我做了一个测试,将横幅的初始帧设置为原点(0,0),没有动画,然后按钮工作正常。所以,我不知道动画的问题或横幅的原始框架是否处于不可见的位置。 BTW,对于横幅不可见非常重要,因为应用程序正在导航栏下方显示。

由于

2 个答案:

答案 0 :(得分:0)

您已编写代码,以便运行一系列动画,其中视图在上一个动画延迟期间显示在屏幕上。默认情况下,对视图进行动画处理时禁用用户交互。尝试在所有嵌套动画的选项中传递UIViewAnimationOptionAllowUserInteraction。

https://developer.apple.com/reference/uikit/uiviewanimationoptions/uiviewanimationoptionallowuserinteraction?language=objc

答案 1 :(得分:0)

好吧,似乎我应该继续寻找更多,因为我发现this question有同样的问题。我在那里尝试了解决方案,现在正在工作。

问题在于链接动画对于用户交互不是一个好主意,所以我使用了NSTimer,就像这样。

- (void)displayBannerInViewController:(UIViewController *)vc
{
  CGFloat originY = 0;
  if (vc.navigationController != nil) {
    originY += 20 + vc.navigationController.navigationBar.bounds.size.height - self.bounds.size.height;
  }
  self.frame = CGRectMake(0,
                          originY,
                          [UIScreen mainScreen].bounds.size.width,
                          self.bounds.size.height);

  if (vc.navigationController != nil) {
    [vc.navigationController.view insertSubview:self atIndex:1];
  } else {
    [vc.view.window insertSubview:self atIndex:1];
  }

  [UIView animateWithDuration:0.3 animations:^{
    self.frame = CGRectOffset(self.frame, 0, self.bounds.size.height);
  } completion:^(BOOL finished) {
    [NSTimer scheduledTimerWithTimeInterval:self.duration target:self selector:@selector(hideBanner) userInfo:nil repeats:NO];
  }];
}

- (void)hideBanner
{
  [UIView animateWithDuration:0.3 animations:^{
    self.frame = CGRectOffset(self.frame, 0, -self.bounds.size.height);
  } completion:^(BOOL finished) {
    if (finished) {
      [self removeFromSuperview];
    }
  }];
}

现在就像一个魅力。