以编程方式从其父视图中删除子视图并将其附加到其他父视图

Posted

技术标签:

【中文标题】以编程方式从其父视图中删除子视图并将其附加到其他父视图【英文标题】:programmatically remove a sub view from it's parent and attaching it to other parent 【发布时间】:2016-06-01 06:38:29 【问题描述】:

我有一个用户可以拖放的 UIButton。我通过以下方法识别拖放:

func addTarget(_ target: AnyObject?,
      action action: Selector, forControlEvents controlEvents: UIControlEvents)

另外,我有一个看法。视图和 UIButton 都是兄弟,在 IB 中定义。

我的目标是当用户将按钮拖到视图中时,按钮将与它的父级断开连接,而它的新父级将是视图。换句话说,按钮将是视图的子视图。

我正在做的是(当按钮被拖入视图时):

button.removeFromSuperview()
view.addSubview(button)

这确实从它的父级中删除了按钮,但我仍然没有在视图中看到它。所以,我试着给按钮一个红色背景,现在当按钮被拖到视图时,我可以在模拟器左上角看到一些奇怪的小红色背景。

谁能告诉我我做错了什么?错过了什么?

【问题讨论】:

您是否在控制台中收到自动布局错误? 您要么必须将translatesAutoresizingMaskIntoConstraints 设置为true,然后设置其frame,要么必须在其新视图中为按钮设置约束。 【参考方案1】:

丹尼尔·拉哈米姆,

我相信按钮已添加到您的视图中,但由于按钮的框架仍指向外部空间(超出子视图框架),您看不到它。尝试设置框架并让我知道你是否能看到它:)

button.removeFromSuperview()
button.frame = CGRectMake(view.center.x, view.center.y, button.frame.size.width, button.frame.size.height)
view.addSubview(button)

【讨论】:

我回家后会试试这个并告诉你。无论如何,我认为button.center正在影响button.frame,所以我不需要重新定义一个Rect。 (因为当按钮移动时,我更新它的中心属性) @daniel-rahamim : 当然伙计 :) 如果您使用任何自动布局约束约束可能会中断,因为您手动将框架更改为可能不满足约束方程的某个值:) 这个答案只是一个试图告诉你没有做错任何事情它只是超出了框架:) 如果你自动布局约束而不是设置框架删除现有约束并将约束添加到你的 childView :) 谢谢。我没有使用任何约束。这只是一个简单的应用程序,我正在尝试学习东西,因为我是 ios 新手。我什至尝试使用 ConvertRect 方法,但这也没有帮助。为什么更新按钮中心还不够?为什么我还需要更新框架? 不,这没有帮助。仍然得到与描述相同的结果。这就是我正在做的: bt.frame = bt.convertRect(bt.frame, toView: innerView) bt.backgroundColor = UIColor.redColor() bt.removeFromSuperview() innerView.addSubview(bt)【参考方案2】:

如果您更改任何对象的父对象,其框架将保持与旧父对象相同。

因此,如果新父级的框架与旧父级不同,则需要根据新父级设置对象的框架。

要更改父对象,您只需将对象添加到新父对象中即可,无需从其旧父对象中删除对象(对象 removeFromSuperview),它将自动管理,因为一个对象可以同时存在于一个父对象中时间。

【讨论】:

如果我要删除 removefromsuperview() 行,那么由于某种原因,按钮会返回到原来的位置,是的,它被添加为子视图。但它不会停留在内部视图中。【参考方案3】:

从超级视图中删除按钮

button.removefromsuperview()

将其添加到视图中

view.addsubview(button)  

【讨论】:

以上是关于以编程方式从其父视图中删除子视图并将其附加到其他父视图的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式设置子视图的框架以使其适合其父视图?

以编程方式对子视图进行约束

如何将子视图从其父视图的父视图置于顶部

单击手势不适用于以编程方式添加的子视图

当父容器视图约束以编程方式更改时,UINavigationController 子视图不调整大小

无法在其父视图之外平移手势较小的 UIView