为什么约束适用于tableView,但仅限于第一次方向更改后?

时间:2014-03-27 01:49:53

标签: uitableview storyboard uitabbarcontroller constraints autolayout

UITabBarController UITableView故事板,约束和自动布局。 ñ 我可以在viewDidLoad中调用一个方法来解决这个问题吗?

小牛队10.9.2 Xcode 5.1

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

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

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

enter image description here

顶部区域有标签约束在UIView的顶部,左侧和右侧

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

按钮标签和开关被约束到UITiew的下半部分,位于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

非常感谢,马克

1 个答案:

答案 0 :(得分:1)

看起来你的约束条件含糊不清,因此界面的某些部分("电子邮件"按钮,UISwitch等)只会出现在某些时候。您需要添加更多约束,以免产生歧义。

关于歧义约束

在启动时,每次旋转设备并且界面旋转以进行补偿时,都会进行布局。这会导致根据约束重新计算视图的位置和大小。如果你的布局只有某些的时候,正如你所说的那样 - 当应用程序启动时出现问题,但是在旋转后它们看起来是正确的(并且再次执行布局) - 这通常是一个标志您有歧义约束。这意味着您所提供的限制使您的布局欠定。运行时不知道该做什么(它没有足够的信息),因此每次布局都可以执行不同的操作。

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

(lldb) po [[UIWindow keyWindow] _autolayoutTrace]

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

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