我的今日扩展需要根据小部件显示的内容具有动态高度。我可以通过在最底部元素上添加约束来实现此目的:底部布局指南的顶部小于或等于最底部元素的底部,常数为 0,优先级为 999,乘数为 1。
这与 iPhone 上的预期完全一样 - 小部件高度适合所有内容,并且在显示下一个小部件之前应用默认的下边距。
但在 iPad 上,它似乎将我的小部件的高度设置为等于通知中心将允许小部件的最大高度 - 我的小部件下面有很多空间,它几乎是全屏的。
我怎样才能删除多余的空间?
我确切地知道问题是什么,但不确定如何解决它 - 请参阅“问题”部分。首先让我解释一下设置:
设置:
我在故事板中设置了此扩展的视图,没有以编程方式完成任何操作。该视图由 5 个垂直堆叠的元素和一些水平堆叠的元素组成。这些是从上到下垂直线的自动布局约束 - 未说明优先级为 1000,乘数 1:
UILabel: height = 35, top space to top layout guide with constant of 10
UIButton: equal height and width to a different button (whose aspect ratio is 1:1, there is no fixed width/height), top space to label 10
UIButton: equal height and width to same button, top space to above button 8
UIButton: equal height and width to same button, top space to above button 8
UIButton: equal height and width to same button, top space to above button 8, bottom space to bottom layout guide <= 0 with priority 999
必要的行为:
- 我需要位于单个全角标签下方的 4x4 按钮网格
- 每个按钮应该具有完全相同的宽度和高度 - 都是完美的正方形
- 最后一排按钮下方没有多余空间
The Result:
The Expected Result:
问题:
所有按钮上的长宽比约束最终会在发送小部件视图时间接对小部件视图的高度施加“隐式”长宽比约束systemLayoutSizeFittingSize:withHorizontalFittingPriority:verticalFittingPriority:
,其中它传递了所需优先级布局所需的宽度 (724) 和适合级别优先级的 0 高度(以压缩视图)。这会导致 iPad 上的小部件视图很高,并且视图一开始就更宽。但没有可以消除的实际长宽比限制。本质上,因为我已经对所有按钮应用了宽高比约束,所以今天扩展的高度取决于其宽度(同时考虑所有约束、宽高比等)。因此,扩展的高度在较宽的区域中显得很笨拙,这在 iPad 这样的宽设备上表现出来。需要重新考虑或以某种方式调整按钮上的限制。
示例项目:
A 演示该问题的示例项目 https://dzwonsemrish7.cloudfront.net/items/1X2O3b053x0a2D2L1c2S/TestWidgetHeight.zip可从 CloudApp 获取,因此您可以下载并使用它。
我尝试过的:
我尝试通过覆盖删除默认边距插入widgetMarginInsetsForProposedMarginInsets
并返回0
为底部。这确实删除了默认的填充,因此稍微降低了高度,但它下面仍然有很多额外的空间。
The UILabel
有一个约束:标签的前导等于超级视图的前导 - 常量 0,优先级 1000,乘数 1。如果我只是将其更改为超级视图的前导margin,额外的底部间距神奇地消失了。我想知道是否是因为元素变得太大,所以增加左侧间距会减小它们的大小,但我尝试将其设置为常规行距并增加常量,但这并没有解决问题。但这只能解决 iPad 的纵向问题。它甚至没有完全解决这个问题,每次你拉下通知中心时,它都会从较大的高度开始,然后缩小到适当的大小。在风景中,它永远不会缩小到适当的尺寸。
尝试过的解决方案:
- @Lefteris 提议对大小进行硬编码,这在这种情况下不起作用
因为高度是动态的并且小部件可用于许多屏幕
尺寸/方向。
- @Yuyutsu 尝试解决它,但不幸的是它不满足要求,并且表现出冲突的约束和修改后的布局。