Dou*_*ith 7 objective-c uitableview ios autolayout ios7
我正在更新我的应用程序以支持iOS 7中的动态类型.根据系统设置调整文本大小相对容易,但是因为我在UITableView的上下文中使用它而且在多个UILabel的单元格中使用它他们,文字大小不是我唯一要担心的事情.如果文本增长,单元格的高度也应该如果文本缩小,那么单元格的高度也应该缩小.
此外,如果它变得更小,与其最大尺寸类型相比,它们之间的间距显然应该更小(因为在较小的尺寸下,两者之间的空间将是巨大的).
当用户更改其动态类型大小时,如何更改更高级的布局问题?
现在,我正在做一些非常丑陋的事情.我看一下我的一个标签的高度,并用它的大小来缩放我的常量.但它非常不精确,因为,当前文本大小的UILabel高度的110%被用作元素之间的填充不一定是普遍有效的.
所以这就是我在那个例子中所做的事情:
CGRect articleTitleRect = [article.title boundingRectWithSize:CGSizeMake(CGRectGetWidth(self.contentView.bounds) - 29, MAXFLOAT)
options:NSStringDrawingUsesFontLeading
attributes:@{ NSFontAttributeName: [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline] }
context:nil];
self.urlConstant.constant = articleTitleRect.size.height / 5;
self.previewConstant.constant = articleTitleRect.size.height / 5;
Run Code Online (Sandbox Code Playgroud)
(基本上找出标签的高度,然后使用百分比来推断间距.再次,非常不精确,并且普遍无法正常工作.)
我考虑的另一件事是检查preferredFontForTextStyle:点大小的电流等于什么,并且对于特定值硬编码接口调整/间隔.这样做效果会好一些,但它似乎仍然不像Apple所想的那样最佳,因为它不是非常动态(例如,如果它们增加了另一种类型的尺寸就会中断)并且你几乎正在嗅着他们不喜欢的价值观给你蝙蝠(这使它看起来很hacky).
那么Tweetbot 3(现在使用Dynamic Type来设置他们的UITableViewCell元素)等应用程序做什么来使他们的UI看起来在不同的动态类型大小上做得好呢?这样做的最佳方法是什么?老实说似乎没有关于这个主题的教程.
我还没有使用过动态类型。但我认为您可以使用的一种方法是使用自动布局来布局单元格内容,并让自动布局引擎确定您所需的单元格高度。然后,当动态类型大小更新时,您只需要求表视图重新加载或重新计算(通过 beginUpdates/endUpdates)。
我用如何使用自动布局来计算任何给定单元格的表格视图单元格高度的示例回答了一个问题,如下:
编辑
根据您的评论:
身高并不是真正的问题,我可以很容易地计算出来。我的问题更多的是如何处理更困难的事情,例如标签之间的空间,随着标签变大,它们的间距也应该稍微增加。也只是基本上学习如何最好地调整受动态类型影响的布局
创建并注册约束后,每当您需要在运行时调整约束时,都可以通过调整constant约束的属性来实现。因此,如果您想根据其他属性(例如文本大小)调整两个项目之间的间距,则必须通过调整管理这两个项目间距的约束常量来手动完成此操作。如果约束是在 Interface Builder 中创建的,则需要将其绑定到某处的 IBOutlet,以便可以在代码中引用它。
约束还有一个 multiplier 属性,您可以使用该属性根据其他视图的计算属性值动态调整一个约束。我认为您无法在 Interface Builder 中操纵它,但如果您在代码中创建约束,则可以。使用乘数,您应该能够设置一个间距约束,根据其他元素的高度调整更大或更小。
在更复杂的场景中,除了调整简单的间距约束之外,您可能希望在给定某些属性更改(例如文本大小)的情况下显着更改布局。在这种情况下,我建议采用以下任一方法:
1) 完全在代码中创建和管理约束。当您确定需要更改布局时,拆除并建立正确的约束集。
2) 创建多个 nib,通过 Interface Builder 定义的约束来管理多个 UI 布局。当您确定需要更改布局时,动态加载/重新加载正确的笔尖。这样做可能带来的不良副作用是您的所有视图/控件都将被重新创建。
| 归档时间: |
|
| 查看次数: |
1052 次 |
| 最近记录: |