今天 iPad 的扩展高度比指定的要大得多

2024-04-11

我的今日扩展需要根据小部件显示的内容具有动态高度。我可以通过在最底部元素上添加约束来实现此目的:底部布局指南的顶部小于或等于最底部元素的底部,常数为 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:
enter image description here

The Expected Result:
enter image description here

问题:
所有按钮上的长宽比约束最终会在发送小部件视图时间接对小部件视图的高度施加“隐式”长宽比约束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 尝试解决它,但不幸的是它不满足要求,并且表现出冲突的约束和修改后的布局。

以下是实现这一目标的方法:

  1. 你应该考虑你的限制。

  2. 您的小部件默认边距插入未按照您想要的方式正确配置,因此通过调用“widgetMarginInsetsForProfusedMarginInsets:”自行设置是唯一的解决方法

// 更新小部件插入

func widgetMarginInsetsForProposedMarginInsets(defaultMarginInsets: UIEdgeInsets) -> UIEdgeInsets {

    println(NSStringFromUIEdgeInsets(defaultMarginInsets))
    return UIEdgeInsetsMake(20, 20, 10, 20)
}

修改后的示例文件链接:修改文件 https://drive.google.com/file/d/0B2CeOYsPpS5MRHNEVlBQZnNoNHM/view?usp=sharing

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

今天 iPad 的扩展高度比指定的要大得多 的相关文章

随机推荐

  • `printf("...") || 的语义printf(“…”) || printf("…")`

    我想知道以下语句在 C 中会打印什么 printf hello n printf goodbye n printf world n 我通常习惯使用 cout 在 C 中打印一些内容 此外 我对这种方式使用的管道和双管道运算符感到困惑 谢谢你
  • 使用brew在MacOSx上安装Redis JSON

    如何使用brew 在 macOSx 上安装 RedisJSON 如何在不编译redis的情况下启用redis上的模块 我不想使用 docker 客户端 Redis Stack 可能是最简单的方法 它不仅仅是 RedisJSON 还包括 Re
  • 从 Node JS 中的生成器获取返回值

    我似乎无法弄清楚如何获取生成器的返回值 有人知道我做错了什么吗 function getGeneratorReturn var generator runGenerator var generatorReturn null var done
  • 使用 Mimes 验证 Laravel 文件 Post - Word 文件

    我有一张已发布的表格 我正在尝试使用验证来仅接受 Word 文档 我尝试使用哑剧类型 但似乎不起作用 而且我无法发现我的错误
  • SQLAlchemy 中的复杂外键约束

    我有两张桌子 SystemVariables and VariableOptions SystemVariables应该是不言自明的 并且VariableOptions包含所有变量的所有可能选择 VariableOptions有一个外键 v
  • 正确使用 Scala 特征和 case 对象

    为了掌握 Scala 类和特征的窍门 这里有一个简单的例子 我想定义一个指定各种操作的类 可以通过多种方式实现 我可以从以下开始 sealed trait Operations def add def multiply 例如 我可能会用一个
  • Windows 批处理脚本中的 URL 编码

    我有一个 Windows 批处理脚本 用于快速进行 Google 搜索 但是 我不知道如何对特殊字符进行一般编码 就像我尝试搜索 C 一样 井号会破坏它 这是我的代码 SET q https www google com q SET q q
  • Laravel Blade 使用自定义函数

    我有一个刀片 用于打印表格的内容 对于某些列 我需要根据要打印的值添加 CSS 类 例如 如果 OK 则添加绿色类 否则添加红色类 当然逻辑会更复杂 但重点是所有逻辑都会与风格相关 哪一个是保存此类函数 方法的最佳推荐位置 我需要创建模型吗
  • 如何在 Android 中以编程方式关闭“询问使用 WLAN”?

    我将收到 一个应用程序请求使用 WLAN 的权限 允许吗 当我尝试更改 WiFi 状态时 Android 5 1 真实手机三星 SM J5008 中的提示窗口 我有谷歌一些信息 例如https groups google com d msg
  • 在哪里可以找到 /usr/include/X11/extensions/Xcomposite.h

    我需要将我的应用程序放在全屏视频上并捕获它以放入我的 python tkinter 应用程序中的 画中画 框架中 我回顾了通常的嫌疑人 图像抓取 mss等 但它们似乎都只是抓取监视器上可见的内容 似乎没有人能够抓住一扇看不见的窗户 我在以下
  • 将变量内容复制到事实中后,Ansible 会抛出错误

    我有变量 其中包含带有其他模板引擎标记的字符串 不幸的是它们是三个花括号 如果我直接使用这些变量 一切都很好 如果我将它们复制到事实中以便随后修改它们 Ansible 会抛出错误 示例剧本 hosts localhost connectio
  • 如何使用对象模型获取 SharePoint 版本

    通过 WSSv2 SharePoint 2003 您可以获得您正在使用的 SharePoint 版本 e g SPGlobalAdmin 版本 http msdn microsoft com en us library microsoft
  • 在 SQL Server Management Studio(2005 或更高版本)中连接不同的 Windows 用户

    SQL Server Management Studio 2005 或更高版本 中是否有办法更改 Windows 身份验证用户 就像在 SQL Server 2000 及更早版本中一样 这是常规连接属性对话框 请注意选择 Windows A
  • 在模型序列化器中获取当前用户

    是否可以在模型序列化器中获取当前用户 我希望这样做而不必脱离泛型 因为这是一项必须完成的简单任务 我的型号 class Activity models Model number models PositiveIntegerField bla
  • 在 Recyclerview 出现之前对其进行测量

    我目前在测量 recyclerView 出现之前遇到问题 我需要测量的高度才能启动 展开 动画 这是我之前在我正在处理的代码中为 gridView 完成的 我正在尝试使用 GridLayoutManager 将其迁移到 RecyclerVi
  • 每组具有最大值的行 - SQLite

    给定一个表columns name lat lon population type 每行有很多行name 我想选择按以下分组的行name where 人口是最高的 如果我仅限于姓名和人口 则以下内容有效 SELECT name Max po
  • 在 React 中逐个字母地“打印”字符串

    我有一个 React Native 组件 需要显示一个带有逐个字母打印的字符串字母的动画 因此 从逻辑上讲 我需要在循环内更新 React 状态挂钩 以 1 秒的间隔将字符串的每个字符附加到其中 到目前为止我所拥有的是 let placeh
  • 在android中以编程方式覆盖文本转语音设置中的“始终使用我的设置”选项

    某些平板电脑具有覆盖应用程序文本转语音设置的选项 名为 文本转语音设置中的 始终使用我的设置 如果选中此选项 则 TTS 引擎将选取 TTS 的用户设置 而不是特定于应用程序的设置 我的要求是 每当我的应用程序使用 TTS 引擎时 应始终使
  • Hibernate + Informix + Blob + 字节数组

    我在将字节数组保存到 Informix 数据库时遇到问题 我将向您展示我是如何尝试的 在 Fichero java 中 我有以下内容 Column name fichero columnDefinition blob private byt
  • 今天 iPad 的扩展高度比指定的要大得多

    我的今日扩展需要根据小部件显示的内容具有动态高度 我可以通过在最底部元素上添加约束来实现此目的 底部布局指南的顶部小于或等于最底部元素的底部 常数为 0 优先级为 999 乘数为 1 这与 iPhone 上的预期完全一样 小部件高度适合所有