【问题标题】:View on screen Resizing and Repositioning itself when new View is added into hierarchy将新视图添加到层​​次结构时,在屏幕上调整大小和重新定位自身
【发布时间】:2016-03-09 05:40:26
【问题描述】:

我有这个问题,我正在屏幕上移动一个“A”视图,用户想要移动的任何地方(从情节提要中添加),我正在使用事件处理方法移动视图,并且工作正常,

我现在遇到的问题是,当我将新的“B”视图(以编程方式)添加到 ViewControllers 视图时,我已移动到其他位置的“A”视图会自动移动到其默认位置。 (在故事板上的位置)。

所以我想,我已经弄清楚了每当我们向视图层次结构 viewWillLayoutSubViews 添加新视图时的原因:get 的调用并将视图重新定位为其默认值。所以我想知道如何防止这种情况发生?

详情见下图:

注意:

  1. A 和 B(橙色和红色都是 UIView)

  2. 从情节提要添加橙色视图,并以编程方式添加红色视图。

还有see我之前关于类似问题的问题,

任何帮助将不胜感激。

【问题讨论】:

    标签: ios objective-c xcode uiview storyboard


    【解决方案1】:

    如果您使用autoLayout,则必须为场景中的所有视图添加约束。
    由于您没有为view A 添加任何约束,系统将在内部添加约束以将视图放置在该特定位置。如果您随后使用框架手动移动视图,这将不成立,因为约束将强制视图移动到其原始位置。

    您可以通过两种方式解决此问题:

    1. 手动为场景中的所有视图添加约束,无论是在情节提要中还是以编程方式添加。每个约束都有一个constant 属性。如果您需要调整视图大小或重新定位视图,请更改此 constant 的值。
    2. 从场景中完全禁用自动布局。然后,您可以通过更改框架来重新定位或调整视图大小。

    希望这会有所帮助! :)

    【讨论】:

    • 我已经考虑过了(在自动布局环境中更改框架不是正确的方法,但在这种情况下,我不知道如何更改以编程方式设置的约束常数),但是我怎样才能改变特定约束的常数,如果它设置在 IB 上(通过制作约束的出口),我知道如何改变约束常数,你能告诉我我该如何解决这个问题。提前致谢。
    • @BharatModi 在以编程方式添加约束之前,通过将它们添加为属性来为它们创建一个句柄,以便以后可以访问它们。假设您有一个名为topConstraint 的属性。您可以稍后更改其值,例如 topConstraint.constant = NEW_VALUE
    • 如果你能提供一些代码,那就太好了,比如我有一个以编程方式设置的leadingSpaceConstraint,以后可以更新。如何做到这一点。
    • 请使用您用于添加约束的代码更新问题。之后我将使用更新的代码更新我的答案。
    【解决方案2】:

    昨天我遇到了同样的问题。如果您使用自动布局约束更改在 xib 或情节提要中创建的视图(在您的示例中为 A)运行时的位置,然后将一些控件添加到同一子视图,视图 A 将定位到原始约束。

    据我所知,有两种解决方案:

    1. viewA.translatesAutoresizingMaskIntoConstraints = YES; 初始化 viewA 后
    2. 以编程方式无限制地创建您的 viewA。

    【讨论】:

    • 我会尽力回复你。
    • 我没有为 A 视图使用自动布局,请参阅此链接 stackoverflow.com/questions/35771409/… 了解有关我面临的问题的更多详细信息。
    • 好的。我在链接中阅读了您的真正问题。首先我必须说我遇到了同样的问题,我用上面的答案解决了它,但我仍然不是 100% 满意。如果我能看到你的代码,我可能会有所帮助,只是截图没有帮助无论如何我会尝试在一些单独的应用程序中创建你的问题。让你知道结果。
    • 我很感激,谢谢!澄清一下, 1. 我的 AView 从情节提要添加到 ViewControllers 视图中,没有约束(其他视图有约束),我已经创建了 AView 的出口,我正在移动它,正如您在我的第一个问题链接中看到的那样。问题是当动态添加新视图(这也是在 xib 上设计并通过子类化 UIView)时,我的 AView 位置会更改为默认位置,也就是它在情节提要上添加的位置。
    • 我尝试从移动视图中删除 AutoLayout,但结果相同。由于容器视图使用 AutoLayout,我认为所有子视图都会以某种方式受到影响。在this link 中查看类似的问题/解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    • 2016-06-22
    • 1970-01-01
    • 2016-07-14
    • 1970-01-01
    相关资源
    最近更新 更多