【问题标题】:How do I install and uninstall a UIButton based on size class?如何根据大小类安装和卸载 UIButton?
【发布时间】:2016-10-18 02:34:23
【问题描述】:

我需要一个按钮以纵向安装,而另一个按钮以纵向(任何宽度、任何高度)卸载,而在横向(任何宽度、紧凑高度)中应该发生相反的情况。其中一个按钮是UIStackView 的一部分,另一个是UIView 的一部分。

在纵向时,应安装UIStackView 中的按钮,但应卸载UIView 中的按钮,正如我前面提到的横向时发生的相反。目前我正在查看我的视图控制器中的userInterfaceIdiom 以获取情节提要,但如果可能的话,我想完全依赖Interface Builder

当删除我的代码(实际上使其行为正确)并仅依靠Interface Builder 来安装/卸载基于size class 的按钮时,为横向安装的按钮总是正确布局,但是当旋转回来时对于纵向,现在应该安装的另一个按钮完全放错了位置,超出了原来的UIStackView,而应该保留但没有保留的UIStackView 现在已扩展以填充缺失的空间按钮应该是。发生这种情况时,日志中没有来自UIKit 的警告或错误,并且我的故事板显示没有冲突。我彻底被难住了!

乍一看,这似乎是一个简单的解决方案。只需选中/取消选中 UI 元素的 size classes 的安装框。虽然,即使在阅读了 Apple 文档和教程之后,事实证明这比我预期的要困难和晦涩。

澄清,我确实没有为纵向安装的按钮设置约束,因为它位于UIStackView 内。另一方面,我确实为横向按钮设置了一些约束。虽然,UIStackView 中的按钮是唯一给我带来麻烦的按钮。

视图调试器在 Xcode 7 中也不起作用,我收到错误消息:warning: could not load any Objective-C class information from the dyld shared cache. This will significantly reduce the quality of type information available. 尝试使用它时。

我认为这可能是一个错误并且与这篇文章有关:UIStackView properties according to size classes

非常感谢您的帮助!谢谢。

【问题讨论】:

  • "当这种情况发生时,日志中没有来自 UIKit 的警告或错误" 但是你有任何自动布局的歧义吗?您不会收到任何警告,但它们可能会导致此类问题。您必须使用日志记录/查看调试来找出答案。
  • @matt 感谢您的快速回复! IB 没有为我的故事板显示基于自动布局的约束和/或框架的任何警告或歧义。你问的是这个吗?
  • 不,我说的是运行时发生的事情。
  • @matt 我在运行时也没有收到这些。有什么建议吗?
  • 我想说,回到用代码做这件事,然后继续。 IB显然不能做你想做的事。没什么大不了的。

标签: ios swift uibutton interface-builder size-classes


【解决方案1】:

如果您希望组件仅出现在特定的尺寸等级中,您可以这样做:

使用您希望它出现的尺寸类将约束添加到您的组件(wCompact hRegular 用于所有 iPhone 纵向,wAny hCompact 用于所有 iPhone 横向)。接下来确保在 Attribute Inspector 中只勾选了该尺寸类。

勾选Installed将使组件出现在任何大小类别中。您可以通过单击屏幕底部中心的选项来更改情节提要文件中视图控制器的大小类(请参阅屏幕底部的蓝色条,其中显示 wAny hCompact在上图中)。

我希望这会有所帮助!

更新

确保组件的约束也设置为正确的尺寸等级。

从 Document Outline 中选择组件的约束并在 Size Inspector 中检查约束的大小类别。通常,当您在情节提要中选择特定尺寸等级的组件添加约束时,将自动为该尺寸等级添加约束。

【讨论】:

  • 我已经安装/卸载了特定尺寸等级所需的元素。就像我说的那样,它们正在正确安装/卸载,但并不总是被正确地“布置”回原来的位置或包含视图。即使我为横向按钮安装/卸载一组约束,也会发生这种情况,而纵向按钮没有约束,因为它位于 UIStackView 中。
  • @logan2995 确保您也在正确的尺寸类别中添加组件的约束,而不仅仅是在正确的尺寸类别中“安装”它。有关组件的约束,请参阅 Size Inspector。我已经用如何执行此操作的屏幕截图更新了我的答案。
  • 奇怪的是,带有约束的按钮,它只为横向安装,工作正常,但为纵向安装的按钮(它没有约束,因为它在 UIStackView 中)是那个不工作的。它甚至不应该来自它的UIStackView。我怀疑UIStackView 正在布置它的其他视图并在按钮被注入视图层次结构之前占用空间。
  • @logan2995 UIStackView 中的按钮,它应该在横向出现还是消失?我将使用 UIStackView 大小类定义更新我的答案。
  • UIStackView 中的按钮只能纵向安装。它根据尺寸等级正确安装/卸载,尽管按钮在旋转回到另一个视图左上角的纵向时完全错位在 UIStackView 之外。
猜你喜欢
  • 2011-06-26
  • 1970-01-01
  • 1970-01-01
  • 2015-02-06
  • 2016-11-07
  • 2014-02-23
  • 2019-03-19
  • 2012-11-03
  • 2021-05-01
相关资源
最近更新 更多