【问题标题】:Custom UIView doesn't get removed from superview when loaded again while animating动画时再次加载时,自定义 UIView 不会从超级视图中删除
【发布时间】:2013-09-23 20:26:50
【问题描述】:

这个问题实际上说明了一切。

我使用以下代码在当前视图之上加载了一个自定义 UIView 动画:

- (void)showView
{
    self.blurView.alpha = 0.f;

    [UIView animateWithDuration:2.0 delay:0.0 options:UIViewAnimationOptionAllowUserInteraction animations:^
     {
         self.blurView.alpha = 1.f;
     } completion:^(BOOL finished) {
         [UIView animateWithDuration:2.0 delay:0.0 options:UIViewAnimationOptionAllowUserInteraction animations:^
          {
              self.blurView.alpha = 0.f;
          } completion:nil];
     }];
}

它可以工作,但是当我再次执行 -(void)showView 它仍在动画时,自定义视图不会从屏幕上删除。

它只是保持这样:

【问题讨论】:

  • 你可以在完成处理程序的末尾执行@property hidden = YES 吗?
  • 如果你把 NSLog 语句放在你有 if (finished) 的地方,它会打印出来吗?
  • 是的,它会打印所有点击。然而 UIView 仍然存在..

标签: iphone ios objective-c animation uiview


【解决方案1】:

我发现了问题所在。

blurView 是一个公共变量,每次我做-(void)showView 时它都使用相同的变量,只将 alpha 设置为 0.f 一次,因此永远不会更改第一个节目的 alpha。

我在方法本身中声明了变量blurView,现在它可以工作了,因为每个blurView 都有自己的指针。

-(void)someMethod
{
    //Create a live blur view
    FXBlurView *blurView = [[FXBlurView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
    blurView.center = CGPointMake(self.view.window.frame.size.width / 2, self.view.window.frame.size.height / 2);
    blurView.layer.cornerRadius = 20.f;
    [self.view.window addSubview:blurView];

    [self showView:(blurView)];
}

- (void)showView:(FXBlurView *)blurView
{
    //Make full transparent before showing
    blurView.alpha = 0.f;

    //Start animation
    [FXBlurView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationOptionAllowUserInteraction animations:^
     {
         blurView.alpha = 1.f;
     } completion:^(BOOL finished) {
         if (finished)
         {
             //End animation
             [FXBlurView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationOptionAllowUserInteraction animations:^
              {
                  blurView.alpha = 0.f;
              } completion:nil];
         }
     }];
}

【讨论】:

    【解决方案2】:

    你应该在你的函数顶部添加这一行:

    [self.view.layer removeAllAnimations];
    

    它将删除所有活动的动画。

    【讨论】:

    • 不起作用。此外,当我将其更改为 [self.view.windows.layer removeAllAnimations]; 时,它仍然失败。
    • 查看我的第二个答案。
    【解决方案3】:

    它不起作用,因为您已经实现了延迟,请使用带有延迟的动画块 - 它会创建可以通过上面的此功能删除的动画键。

    [UIView animateWithDuration:0.3 delay:0.0
                        options:UIViewAnimationOptionAllowUserInteraction
                     animations:^
     {
         // ...
     } completion:NULL];
    

    【讨论】:

    • 你的版本更干净,我编辑了我的问题。但不幸的是问题仍然存在..
    • 你确定吗?你检查了 [self.blurView.layer removeAllAnimations] 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多