有很多不同的方法可以解决这个问题。最终,您可以在运行时控制任何这些元素的大小。从用户体验的角度来看,您可能希望至少保持一些元素的大小固定(例如,代表新闻项目总大小的图像和滚动视图)。这将留下标题和细节的相对大小。如果要显示整个标题,可以使用NSString 类的sizeWithFont 方法(或其变体之一)来计算标题使用多少空间,并将剩余空间分配给细节根据需要。
更新:我可能会补充说,我打算将其作为一般策略,而不是专门针对新的 iOS 5 Storyboard 功能。
更新:好吧,没有教程,但这里有一些通用指南(至少是关于我可能解决它的方式)。
我会设置一个 NewsItem 类来封装您在此处描述的元素,类似于我在示例图像中布置的内容。你如何暴露NewsItem 是一个品味问题;您可能希望从 UITableView 作为容器开始,因为它会使管理 NewsItem 集合变得更简单。我将UITableViewCell 子类化为NewsItemTableViewCell,并使用Interface Builder 为NewsItem 生成名义布局。因此,在示例图像中,一条新闻将对应一个表格行。
您所询问的主要部分由图像中的红框和蓝框标识。使用上述方法,我将在NewsItemTableViewCell 中添加逻辑来计算标题的范围——这假设视图(在本例中为NewsItemTableViewCell)具有模型的明确知识(用于新闻项目)以引用的形式(即NewsItem 类的实例
包含您描述的从 Web 服务检索的项目)。如果标题的宽度大于红框的默认宽度,我会调整红框的高度(增加它),同时降低蓝框的高度。这种方法避免了在表格中包含不同单元格高度的额外逻辑。
我经常使用的另一种方法是在 View 和 Model 之间设置一个 Controller 类。当您需要表格包含不同类型的单元格时,这会很有用;它还使 tableview 单元重用更加简单。在这种情况下,声明一个基类。这可能看起来像:
@protocol GenericCellController
- (UITableViewCell*) tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath;
@optional
- (void) tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath;
@end
然后:
@interface NewsItemTableCellController : NSObject<GenericCellController> {
NewsItem* newsitem;
}
然后设置表格单元控制器对象的集合。这样做的好处是,当您在 tableview 控制器代码中实现 tableView:cellForRowAtIndexPath: 时,您只需委托给相应行的单元控制器对象。更重要的是,您可以使用超类名称来引用它;例如,在假设的 NewsItemTableViewController 课程中,您可能有:
- (UITableViewCell*) tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*) path {
NSObject<GenericCellController>* cellController = [cellControllerArray objectAtIndexPath:indexPath.row];
UITableViewCell* cell = [cellController tableView:tableView cellForRowAtIndexPath:indexPath];
return cell;
}
这种方法允许您在集合中拥有从 NSObject 派生的任何类,并以多态方式使用委托让派生类处理呈现逻辑。派生的 Controller 类有自己的 tableView:cellForRowAtIndexPath: 实现,以及对应的 UITableViewCell 派生子类,如上所述。
如果您决定采用这种方式,可以使用许多关于 tableview 及其控制器基础知识的示例作为实现这些想法的前言。