Swift:removefromSuperview 移除约束

Posted

技术标签:

【中文标题】Swift:removefromSuperview 移除约束【英文标题】:Swift: removefromSuperview removes constraints 【发布时间】:2016-01-10 12:03:03 【问题描述】:

目前正在开发一些快速程序,我有一个号召性用语,我从超级视图中删除了一个模糊视图,同时我正在为 2 个按钮设置动画。

一切正常,但有一个小问题。当我从我的超级视图中删除模糊视图时,我的 2 个按钮上的约束在底部设置为 0 并从该位置开始动画。

我不希望它们变为 0。如果我不删除模糊视图,我的动画效果会很好。我检查了我的按钮约束是否与模糊视图相关,但事实并非如此。因为我认为它只能在我的约束相对于模糊视图时重置我的约束。

我的故事板如下所示:

view
  |->  camera_view
  |->  blur_view
  |->  record_label
  |->  record_button

我正在执行的代码如下:

@IBAction func recordButton(sender: AnyObject) 
    self.blurView?.removeFromSuperview()
    UIButton.animateWithDuration(0.3, delay: 0.2, options: .CurveEaseOut, animations: 
        var recordButtonFrame = self.recordButton.frame
        var recordLabelFrame = self.recordLabel.frame

        recordButtonFrame.origin.y -= recordButtonFrame.size.height
        recordLabelFrame.origin.y -= recordLabelFrame.size.height

        self.recordButton.frame = recordButtonFrame
        self.recordLabel.frame = recordLabelFrame
        , completion:  finished in
            print("Button moved")
    )

我做错了什么?

亲切的问候,

沃特

【问题讨论】:

self.blurView?.hidden = true 谢谢它解决了我的问题。忘了那个。它仍然以这种方式留在记忆中吗?如果我再次需要 blurview 的实例,这种方式会更快,但如果我不需要它会更慢? 是的,如果你只是隐藏它,它将保留在内存中。也许您可以先将其隐藏,然后在动画完成后将其删除。 【参考方案1】:

您可以隐藏它,而不是从 superview 中删除 blurView

替换

self.blurView?.removeFromSuperview()

self.blurView?.hidden = true

【讨论】:

(不是你要求的,但是)在动画块内 self.blurView?.effect = nil 也会给你一个动画去模糊效果。 在这里学到了很多东西,只有一个主题。感谢安东尼斯的加入。真的不需要它,但它对功能参考很有用! @Dalija Prasnikar,感谢您解决问题。【参考方案2】:

问题是您在使用约束时为帧设置动画。您应该为约束更改/约束常量值更改设置动画。

当您不删除视图时,不会重新计算布局,因此您的帧动画“有效”。这是不正确的,将来会重新组织。

当您移除视图时,布局会重新计算,并且所有内容都会在动画开始之前移动。

您没有提供约束的详细信息,但您似乎应该在移除视图之前对约束进行动画处理,然后在完成时移除并确保约束一切正常。

【讨论】:

谢谢,我非常感谢有关约束的所有信息。 Dalija Prasnikar 已经通过隐藏它解决了这个问题,但我认为这是一个非常好的补充。 虽然隐藏它可能会解决您当前的问题,但如果您仍在为帧制作动画,您的方法仍然是错误的,并且可能会在未来给您带来问题 嗯,好吧。将研究约束动画,看看我是否可以重写我的代码。谢谢你的建议! 设法获得了一些约束动画。这东西很神奇。甚至比帧动画更容易。而且超级顺滑。将您的答案标记为正确答案。 IBAction func recordButton(sender: AnyObject) self.recordLabel.text = "START" self.recordBottomConstraint.constant = 130 UIView.animateWithDuration(0.3, delay: 0.2, options: .CurveEaseOut, animations: self.view.layoutIfNeeded() , completion: finished in print("Button moved") )

以上是关于Swift:removefromSuperview 移除约束的主要内容,如果未能解决你的问题,请参考以下文章

出口集合 removefromsuperview

为 CollectionView [Swift] 的单独 Cell 设置圆形标签

removeFromSuperview 随机崩溃

removeFromSuperview() 并不总是有效

无法使用 removeFromSuperview 方法删除视图

关于removeFromSuperview