【问题标题】:Why do constraints work on tableView, but only After the first orientation change?为什么约束在 tableView 上起作用,但仅在第一次方向更改之后?
【发布时间】:2014-05-05 18:53:01
【问题描述】:

UITabBarController UITableView 故事板、约束和自动布局。 n 有没有我可以在 viewDidLoad 中调用的方法来解决这个问题?

小牛队 10.9.2 Xcode 5.1

这是关于一个 iOS 应用程序,UITabBarController 包含在其 UIView 中的 UIViewController

top area:UILabel
middle area:UITable
bottom area: Button, Label and Switch

这是我第一个故事板的照片:

顶部区域有它的Label约束到UIView的顶部、左侧和右侧

中间的 UITableView 被限制在顶部和底部之间的中心区域

Button Label 和 Switch 被限制在 UIView 的下部,在 UITableView 下方。

View 首次出现时,UITableView 向下延伸太远,覆盖了 Button、Label 和 Switch

https://www.dropbox.com/s/d0mqin7bh4cglgj/Screenshot%202014-03-26%2021.18.23.png

在第一次旋转更改后,约束按预期工作。

https://www.dropbox.com/s/047fj86caqpp5kl/Screenshot%202014-03-26%2021.19.29.png

然后,约束在任意数量的方向变化中继续起作用。

https://www.dropbox.com/s/fug0znnf8fc1etr/Screenshot%202014-03-26%2021.21.28.png

有什么解决办法吗?

https://www.dropbox.com/s/0f1oabbj9e05j2h/Screenshot%202014-03-26%2021.22.47.png

非常感谢,马克

【问题讨论】:

  • 它看起来更像是“按钮标签和开关”只是从屏幕上移开。这通常是约束不足的标志。您是否在情节提要中收到任何警告?或者,运行常规检查以查看您是否有不明确的布局。
  • 马特,你写得真好。有 4 个关于错位视图的警告,所有关于电视下方的四个对象,但没有关于 UITableView。如果约束在加载时起作用,然后在第一次方向改变时失效,我会说约束肯定是“错误的”,事实上约束在第一次加载时失效,然后在第一次旋转后按我想要的方式工作,这让我觉得我需要从我的代码中调用一些方法。
  • 你说的符合我的理论。在屏幕截图中,表格视图看起来并没有覆盖四个对象;看起来这四个对象只是丢失了。您应该在情节提要上工作,直到没有更多警告为止!
  • 谢谢马特,我需要另一种克制!
  • 我会写下我的建议作为实际答案,以帮助其他人。

标签: uitableview storyboard uitabbarcontroller constraints autolayout


【解决方案1】:

您似乎有一些模棱两可的限制,因此您界面的某些部分(“电子邮件”按钮、UISwitch 等)仅在某些时候出现。你需要添加更多的约束,这样就不会有歧义了。

关于模糊约束

在启动时,以及每次您旋转设备并且界面旋转以进行补偿时,都会发生布局。这会导致根据约束重新计算视图的位置和大小。如果您的布局仅在某些时间起作用,正如您所说 - 应用程序启动时出现问题,但在您旋转后它们似乎正确(并且再次执行布局) - 这通常是一个迹象你有不明确的约束。这意味着您提供的约束未确定您的布局。运行时不知道该做什么(它没有足够的信息),因此每次新执行布局时它可能会做不同的事情。

当您有不明确的约束时,您不会在应用程序运行时在控制台中收到任何通知。因此,模棱两可的约束可能会引起您的注意。如果您的约束是在代码中提供的,则此问题尤其严重。一个有用的技巧是在调试器中暂停你的应用程序并在控制台命令行中输入这个(然后点击 Return):

(lldb) po [[UIWindow keyWindow] _autolayoutTrace]

如果任何视图的布局不明确,它们将在运行时的响应中明确标记。

如果您的约束都是在 Interface Builder 中形成的,那么 Xcode 5 可以很好地为您提供问题警告。第一条规则应该是:如果您看到任何警告,请注意!处理您的约束,直到 Interface Builder 中不再有警告。然后,只有这样,运行应用程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    相关资源
    最近更新 更多