【问题标题】:How to prevent AutoLayout from resetting view frames?如何防止 AutoLayout 重置视图框架?
【发布时间】:2023-03-29 06:10:01
【问题描述】:

我有一个带有 AutoLayout 的视图,它适用于不同的屏幕尺寸。屏幕上有一个元素,但它会根据用户操作四处移动。每当我向下导航到另一个屏幕然后返回此视图时,此元素都会重置为其原始位置。

我明白为什么会发生这种情况,但我该如何预防呢?我确实希望它最初设置正确,但不是在第一次之后。

【问题讨论】:

  • 您目前如何移动漂浮物?你是直接设置它的框架,还是修改它的约束?
  • 这不应该发生,没有理由发生。您可以发布您的代码以返回此视图吗?另外,如果您正在以任何方式设置此元素的位置,请检查 viewdidappear 或 viewwillappear 下。
  • @robmayoff 我通过设置框架来移动使用。也许我应该调整约束?
  • @LuisOscar 你确定是 Luis 吗?这没有意义,但它发生了,我没有覆盖 viewDidAppear 或 viewWillAppear。
  • "也许我应该调整约束" 是的,你应该 -- 如果你使用约束,你的代码中不应该有任何 setFrame: 调用。所以要么打开自动布局,要么调整约束。

标签: ios objective-c autolayout


【解决方案1】:

我找到的唯一解决方案是,实现viewDidLayoutSubviews

它会在视图加载后立即调用layoutSubviews 方法..

- (void)viewDidLayoutSubviews
{
    @try
    {
         // Adjusting controls.
    }
    @catch (NSException *exception)
    {
        NSLog(@"%s\n exception: Name- %@ Reason->%@", __PRETTY_FUNCTION__,[exception name],[exception reason]);
    }
}

【讨论】:

  • tooooo goooood,这是一个也适用于 ios 的委托方法 :):)
【解决方案2】:

如果您使用 Autolayout,则永远不应使用 setFrame/setBounds,因为正如您所见,Autolayout 会忽略它们并在更新时重写它们。

解决办法是改变约束。约束有一个名为constant 的参数,这是创建约束后唯一可以更改的参数。当您需要移动 NSViews 时,您还可以添加/删除额外的约束。

WWDC 2012 上有一个视频,其中有一个非常好的示例,说明如何使用 AutoLayout 移动视图。

【讨论】:

    猜你喜欢
    • 2015-05-04
    • 2020-05-09
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 1970-01-01
    相关资源
    最近更新 更多