如何UITableViewCell在表格视图中使用s 内的自动布局,让每个单元格的内容和子视图确定行高(本身/自动),同时保持平滑的滚动性能?
我正在尝试UICollectionViewCells使用自动布局进行自我调整,但我似乎无法让单元格根据内容调整自己的大小.我无法理解如何根据单元格内容中的内容更新单元格的大小.
这是我尝试过的设置:
UICollectionViewCell一个UITextView.UITextView已禁用.UITextView固定在单元格左侧,显式宽度为320.UITextView固定到单元格的顶部.UITextView具有高度限制设置为其中一个恒定的UITextView报告将适合文本.这是单元格背景设置为红色,UITextView背景设置为蓝色的样子:

我把我已经在GitHub上玩的项目在这里.
我刚观看了WWDC视频#216,"用UIKit构建自适应UI".
大约在45:10,Tony Ricciardi谈到了Xcode 6中IB的变化,以支持新的变化.
他说:"你可以将这些文档向后部署到旧版本的iOS".
(其中"这些文档"可能意味着具有针对不同大小类别的特定设置的XIB和故事板.)
我不是这样做的.去观看WWDC视频.
怎么可能?特征集合和大小类仅在iOS 8中定义.如果依赖于iOS 8新增的UI构造的运行时行为如何在以前的iOS版本中运行?
如果有可能那就太棒了.您可以构建将在iOS 6,7和8上运行的应用程序,并利用Apple添加到Xcode 6中的新的灵活UI布局功能.我已经在代码中创建了自适应UI逻辑,并且它有点相当工作的.
使用"动态原型"指定UITableView故事板上的内容时,可以将"行高"属性设置为"自定义".
实例化单元格时,不考虑此自定义行高.这是有道理的,因为我使用的原型单元是由我的应用程序代码在要实例化单元时决定的.在计算布局时实例化所有单元格会引入性能损失,所以我理解为什么不能这样做.
那么问题是,我可以以某种方式检索给定单元重用标识符的高度,例如
[myTableView heightForCellWithReuseIdentifier:@"MyCellPrototype"];
Run Code Online (Sandbox Code Playgroud)
或那条线上的东西?或者我是否必须在应用程序代码中复制显式行高,以及后续的维护负担?
在@TimothyMoose的帮助下解决了:
高度存储在单元格本身中,这意味着获得高度的唯一方法是实例化原型.这样做的一种方法是将细胞预先出列在正常细胞回调方法之外.这是我的小POC,它起作用:
#import "ViewController.h"
@interface ViewController () {
NSDictionary* heights;
}
@end
@implementation ViewController
- (NSString*) _reusableIdentifierForIndexPath:(NSIndexPath *)indexPath
{
return [NSString stringWithFormat:@"C%d", indexPath.row];
}
- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if(!heights) {
NSMutableDictionary* hts = [NSMutableDictionary dictionary];
for(NSString* reusableIdentifier in [NSArray arrayWithObjects:@"C0", @"C1", @"C2", nil]) {
CGFloat height = [[tableView dequeueReusableCellWithIdentifier:reusableIdentifier] bounds].size.height;
hts[reusableIdentifier] = [NSNumber numberWithFloat:height];
}
heights = [hts copy];
}
NSString* prototype = [self _reusableIdentifierForIndexPath:indexPath];
return [heights[prototype] floatValue];
} …Run Code Online (Sandbox Code Playgroud) 设置estimatedRowHeight和rowHeight的UITableView使表视图计算每个细胞的适当的高度.在我使用大小类之前,它就像一个魅力.看起来所有的计算都是针对Any/Any size类进行的,稍后会应用更大的字体.结果,没有正确计算单元的高度并且标签不适合.
这是我的代码:
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.estimatedRowHeight = 50
self.tableView.rowHeight = UITableViewAutomaticDimension
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 3
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Reuse", forIndexPath: indexPath) as! MyTableViewCell
println("Label font size: \(cell.myLabel.font)") // it prints (...)font-size: 11.00pt for all the size classes
return cell
}
}
Run Code Online (Sandbox Code Playgroud)
布局看起来像这样: …
ios ×4
uitableview ×3
autolayout ×2
adaptive-ui ×1
nsautolayout ×1
row-height ×1
size-classes ×1
uistoryboard ×1
xcode6 ×1