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 移除约束的主要内容,如果未能解决你的问题,请参考以下文章
为 CollectionView [Swift] 的单独 Cell 设置圆形标签