【问题标题】:Remove UIView from super view after animation ended动画结束后从超级视图中删除 UIView
【发布时间】:2018-03-16 01:47:54
【问题描述】:

我正在为 UIView (alpha) 属性设置动画,我希望在动画完成后可以将其从超级视图中移除。

    -(void) hideOverlayView
{
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:1.0];

    [topView setAlpha:0];

    [UIView commitAnimations];

}

一种选择是使用带有延迟选项的 performSelector,但有更紧凑的方法吗?

更新1:

为什么这段代码会立即删除视图?

[UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:1.0];
    [UIView setAnimationDelegate:topView];
    [UIView setAnimationDidStopSelector:@selector(removeFromSuperview)];

    [topView setAlpha:0];

    [UIView commitAnimations];

我应该提一下,我首先制作的是淡入动画,然后是淡出动画。上面是淡出代码,它会立即移除 UIView 而不是产生淡出效果。

【问题讨论】:

  • 我遇到了同样的问题,视图被立即删除。我正在使用块,代码在 dispatch_async 中。这似乎是一个错误。然后我像您的代码一样使用 [UIView beginAnimations 进行切换,它可以正常工作。虽然我使用了自己的选择器,而不是 UIView 类中的 removeFromSuperview 选择器。

标签: ios


【解决方案1】:

直接来自UIView docs

[UIView animateWithDuration:0.2
     animations:^{view.alpha = 0.0;}
     completion:^(BOOL finished){ [view removeFromSuperview]; }];

或者在您的具体情况下:

[UIView animateWithDuration:1.0
    animations:^{topView.alpha:0.0;}
    completion:^(BOOL finished){ [topView removeFromSuperview]; }];

【讨论】:

  • 奇怪的是,您的代码也会立即删除 UIView 而不执行动画。我正在执行按钮点击动画。
  • +1,像魅力一样工作。小心不要从另一段代码(例如管理它的视图控制器)中删除视图,因为这可能会破坏动画。
  • GLKView 上的动画膨胀(如矢量宽度增加 5)的某些原因。我正在清除缓冲区,但是很好。我决定是否将其从视图中移除,并且在 0.15 秒内,没有人会注意到。
【解决方案2】:

您可以使用块来执行这种操作 ;)
像这样的:

[UIView animateWithDuration:1.0 animations:^{
    topView.alpha = 1.0; topView.alpha = 0.0;
} completion:^(BOOL success) {
    if (success) {
        [topView removeFromSuperview];
    }
}];

【讨论】:

  • 由于某种原因,[topView removeFromSuperView] 被立即触发。我从按钮触摸调用的方法内部调用上述内容。
  • 看起来很奇怪......我在我的应用程序中使用了这段代码。我在应用程序启动时初始化视图,我创建了一个方法,我在其中关闭视图控制器,然后触发此动画,并在完成一些 textFields 后调用它...
  • 我触发了触发上述代码的按钮单击方法。按钮被添加到 UIView 并且 UIView 也是动画的。
  • 我将把它作为一个单独的问题发布,因为我需要添加更多代码。感谢大家的帮助!
【解决方案3】:

斯威夫特

UIView.animate(withDuration: 0.5, animations: {
        self.exampleView.alpha = 0.0
        }, completion: { (finished: Bool) in
          self.exampleView.removeFromSuperview() 
        })

【讨论】:

    【解决方案4】:

    如果你使用 CAKeyframeAnimation 或类似的,你需要为动画分配一个代理。

    我创建了这个类作为委托(Swift 3):

    class AnimationDelegate: NSObject, CAAnimationDelegate {
        typealias AnimationCallback = (() -> Void)
    
        let didStart: AnimationCallback?
        let didStop: AnimationCallback?
    
        init(didStart: AnimationCallback?, didStop: AnimationCallback?) {
            self.didStart = didStart
            self.didStop = didStop
        }
    
        internal func animationDidStart(_ anim: CAAnimation) {
            didStart?()
        }
    
        internal func animationDidStop(_ anim: CAAnimation, finished flag: Bool) {
            didStop?()
        }
    }
    

    然后我可以像这样使用那个类:

    let animateView = UIView()
    let anim = CAKeyframeAnimation(keyPath: "position")
    anim.delegate = AnimationDelegate(
                didStart: nil,
                didStop: {
                    heart.removeFromSuperview()
            })
    animateView.layer.add(anim, forKey: "animate position along path")
    

    【讨论】:

      【解决方案5】:

      如果您的目标是> iOS 4,那么您应该查看块。否则请查看UIView 的文档,特别是setAnimationDelegate:

      【讨论】:

        【解决方案6】:

        如果您的视图是类变量并且可以重新创建以使其淡出然后再显示新数据,您可能需要这样的东西:

        斯威夫特 4

        func removeView(animated: Bool) {
            guard let index = subviews.index(of: viewToRemove) else { return }
            animated ? removeSubViewWithFading(from: index) :
                viewToRemove.removeFromSuperview()
        }
        
        private func removeSubViewWithFading(from index: Int) {
            let view = self.subviews[index]
            UIView.animate(withDuration: 1, animations: {
                view.alpha = 0
            }, completion: { _ in
                if self.subviews.count > index {
                    view.removeFromSuperview()
                }
            })
        }
        

        【讨论】:

          猜你喜欢
          • 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
          相关资源
          最近更新 更多