1

我的应用程序包含一个新闻部分。我正在尝试在我的故事板中创建一个视图,它将显示一个新闻项目。新闻包含标题、日期、图像和一些文本。

像这样的内容很容易在 HTML 中显示,因为它的内容是浮动的,但据我了解,iOS 元素具有固定大小。我认为 aUILabel可以用于标题和日期、UIImage图像和 aUITextView文本。我认为所有元素都应该在滚动视图中。问题是,某些新闻的标题会占一行,而其他新闻的标题会占多行。

如何在情节提要中处理这样的设置?一个指南的链接,教程会很好。

4

1 回答 1

3

有很多不同的方法可以解决这个问题。最终,您可以在运行时控制任何这些元素的大小。从用户体验的角度来看,您可能希望至少保留一些固定大小的元素(例如,代表新闻项目总大小的图像和滚动视图)。这将留下标题和细节的相对大小。如果要显示整个标题,可以使用类的sizeWithFont方法(或其变体之一)NSString来计算标题使用多少空间,并根据需要从剩余量分配空间到细节。

更新:我可能会补充说,我打算将其作为一般策略,而不是专门针对新的 iOS 5 Storyboard 功能。

更新:好吧,没有教程,但这里有一些一般指南(至少关于我可能解决它的方式)。

我会设置一个NewsItem类来封装您在此处描述的元素,类似于我在示例图像中布置的内容。你如何暴露NewsItem是一个品味问题。您可能希望从 UITableView 作为容器开始,因为它会使管理NewsItem集合变得更简单。我将子类UITableViewCell化为,并为使用 Interface BuilderNewsItemTableViewCell生成名义布局。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:cellForRowAtIndexPath:在 tableview 控制器代码中实现时,您只需委托给相应行的单元控制器对象。更重要的是,您可以使用超类名称来引用它;例如,在一个假设的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 及其控制器基础知识的示例,您可以将它们用作实现这些想法的前言。

在此处输入图像描述

于 2011-12-07T18:51:48.783 回答