当前位置: 首页 > 知识库问答 >
问题:

使用 iOS 7 中的动态类型,如何考虑更高级的布局问题,例如标签/视图之间的间距?

漆雕皓轩
2023-03-14

我正在更新我的应用程序以支持iOS 7中的动态类型。根据系统设置,使文本调整其大小相对容易,但是由于我在UITableView和其中有多个UI标签的单元格的上下文中使用它,因此文本大小并不是我唯一需要担心的事情。如果文本增大,单元格的高度也应增加,如果文本缩小,单元格高度也应缩小。

此外,如果它变得更小,与最大尺寸的类型相比,项目之间的间距显然应该更小(因为在较小的尺寸下,项目间的间距将是巨大的)。

当用户改变他们的动态字体大小时,我如何改变更高级的布局问题?

现在,我正在做一些非常丑陋的事情,几乎不起作用。我看着我的一个标签的高度,并用它的大小来缩放我的常量。但是它非常不精确,因为,比如说,当前文本大小的UILabel高度的110%被用作元素之间的填充并不一定普遍有效。

这就是我在这个例子中所做的:

    CGRect articleTitleRect = [article.title boundingRectWithSize:CGSizeMake(CGRectGetWidth(self.contentView.bounds) - 29, MAXFLOAT)
                                                          opthtml" target="_blank">ions:NSStringDrawingUsesFontLeading
                                                       attributes:@{ NSFontAttributeName: [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline] }
                                                          context:nil];
    self.urlConstant.constant = articleTitleRect.size.height / 5;
    self.previewConstant.constant = articleTitleRect.size.height / 5;

(基本上找出标签的高度,然后使用其中的百分比来推断间距。同样,非常不精确,并且不能普遍使用。

我考虑做的另一件事是检查当前preferredFontForTextStyle:在点大小上等于什么,并为特定值硬编码接口调整/间距。这工作得稍微好一点,但它似乎仍不符合苹果的想法,因为它不是非常动态的(例如,如果他们增加另一个类型大小,它就会崩溃),而且你几乎在嗅探他们没有给你提供的值(这让它看起来很不整洁)。

那么,像Tweetbot 3这样的应用程序(现在使用Dynamic Type来设置UITableViewCell元素)如何在不同的Dynamic Type大小上使UI看起来如此完美呢?做这件事的最佳方式是什么?老实说,似乎没有关于这个主题的教程。

共有2个答案

马才
2023-03-14

我还没有使用过动态类型。但是我认为你可以使用的一种方法是使用自动布局来布局你的单元格内容,并让自动布局引擎决定你需要的单元格高度。然后,当动态类型大小更新时,你只需要求表视图重新加载或重新计算(通过starinUpdate/endUpdate)。

我用一个如何使用自动布局来计算任何给定单元格的桌面视图单元格高度的例子回答了一个问题,这里:

如何调整超级视图的大小以适合具有自动布局的所有子视图?

编辑

根据您的评论:

高度不是真正的问题,我可以很容易地计算出来。我的问题是如何处理更难的事情,比如标签之间的空间,随着标签变得越来越大,它们的行间距也应该稍微增加。此外,我只是基本上学习如何最好地调整受动态类型影响的布局

一旦创建并注册了约束,您就需要在运行时调整约束,您可以通过调整约束的常量属性来实现。因此,如果您想根据其他属性(例如文本大小)调整两个项目之间的行间距,您必须手动调整管理这两个项目行间距的约束常量。如果约束是在Interface Builder中创建的,您需要将其绑定到某个地方的IBOutlet,以便在代码中引用它。

约束还有一个multiplier属性,您可以使用它根据其他视图的计算属性值来动态调整一个约束。我不认为你可以在界面构建器中操作它,但是如果你在代码中创建你的约束,你可以。使用multiplier,您应该能够设置一个间距约束,它可以根据其他一些html" target="_blank">元素的高度来调整大小。

在一个更复杂的场景中,除了调整简单的间距约束之外,您可能希望在给定一些属性变化(例如,文本大小)的情况下显著地改变布局。在这种情况下,我会推荐以下两者之一:

1)完全在代码中创建和管理约束。当您确定需要转换布局时,拆除并建立一组正确的约束。

2)创建多个笔尖,通过界面生成器定义的约束来管理多个UI布局。当您确定需要改变布局时,动态加载/重新加载正确的笔尖。这可能会产生不良的副作用,即所有的视图/控件都将被重新创建。

纪秋月
2023-03-14

这是你必须自己做的事情,但iOS已经为你提供了使用TextKit所需的工具。测试编程指南中实际上有很多文档。

例如,在“使用字体对象”部分中,UI 内容大小更改通知(通知你的应用动态类型值已更改)以及具有新值的用户信息字典。这是您要进行哪些更改的入口点。例如,如果新值为“UI内容大小类别可访问性中”,则两个标签之间的距离为 10 磅,但如果新值为“UI内容大小类别可访问性”较大,则可以将其设置为 15。当然,我只是在编造价值观,找出最有效的方法是你必须通过反复试验来做的事情。但是,一旦你弄清楚了正确的距离,确保一切正常应该不需要超过十几行代码

还要看看UIFontDescriptor,尤其是引用底部的常量。它们允许您访问几乎所有可以想象到的字体属性和特征。您可以使用它来“构建”具有自定义属性的自己的字体。如果您想这样做,需要更多代码,但是TextKit为您提供了许多不同的API,用于在屏幕上显示文本。

 类似资料:
  • 我在表格视图中的自定义单元格中有一个标签。我想在用户录制单元格后更改单元格高度和标签高度(起初我只显示2行,我想显示更多文本), 我可以根据单元格内容更改单元格高度,但不幸的是,我无法更改标签高度:(我已经阅读了大量stackoverflow答案,但仍然一无所获。 人们认为这是可行的: 但这在iOS 7中被弃用;任何人都可以帮我调整单元格中的标签大小吗?

  • 2个使用下划线标签包裹的HTML的ruby标签,为什么中间会有间隔? 如题: 我想让「源義経」这三个字的下划线能连续起来,现在不知道什么原因,中间断开了

  • 我正在尝试创建一个具有一些标签和UITableView的视图。首先,我尝试创建UIView= 滚动工作正常,但现在我有自动布局的问题。 标题视图有2个标签。“LeftLabel”和“RightLabel”。RightLabel应该具有动态高度和 在代码中,我试图添加一个不适合1行的文本,而autolaout标签应该扩展并使用2到3行来适应文本。 我把演示项目上传到了github:https://g

  • 我已经读了很多关于ios7ui转换的书。 我不能得到这三个属性自动调整ScrollViewInset,扩展布局包括OpaqueBars,edgesForExtendedLayout? 例如,我试图使视图控制器从状态栏下方开始,但无法实现。

  • 我在xib文件中使用自动布局,而不是使用。我在self.view上添加了一个。我正在尝试设置UIImageView宽度和超级视图高度的纵横比。但当我将控件从

  • 问题内容: 我想从放置在和标记中的HTML页面提取文本,因此我可以开始对该页面进行标记化,以便为每个页面构造倒排索引,以便回答搜索查询。 我如何使用jsoup 获取标签 要在该参数中写入的字符串是什么? 问题答案: 这可以做的工作 这是您可以使用的所有选择器的列表。 假设您有这个html: 要获得结果,您应该使用: 要么 假设现在您具有以下复杂的html 要从两个标签中获取值,您必须执行以下操作