iOS故事板:如何处理动态,浮动的内容?

时间:2011-12-07 18:25:21

标签: objective-c cocoa-touch uistoryboard

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

这样的内容很容易在HTML中显示,因为它的内容是浮动的,但据我所知,iOS元素具有固定的大小。我认为UILabel可能适用于标题和日期,UIImage适用于图片,UITextView适用于文字。我认为所有元素都应该在滚动视图中。问题是,某些新闻的标题将填满一行,但其他新闻的标题将填满多行。

如何在故事板中处理这样的设置?指南的链接,教程没问题。

1 个答案:

答案 0 :(得分:3)

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

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

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

我设置了一个NewsItem类,它封装了你在这里描述的元素,类似于我在示例图像中列出的内容。你如何揭露NewsItem是一种品味问题;您可能希望以UITableView作为容器开始,因为它会使管理NewsItem集合变得更简单。我将UITableViewCell子类化为NewsItemTableViewCell,并使用Interface Builder为NewsItem生成名义布局。因此,在示例图像中,新闻项将对应于一个表行。

您要问的主要部分由图像中的红色和蓝色框架标识。使用上面的方法,我会在NewsItemTableViewCell中添加逻辑来计算标题的范围 - 这假设视图(在这种情况下,NewsItemTableViewCell)具有模型的明确知识(引用形式的新闻项的基础数据(即NewsItem类的实例 包含您从Web服务检索的项目)。如果标题的宽度大于红框的默认宽度,我会调整红框的高度(增加它),同时减小蓝框的高度。这种方法避免了必须在表格中包含不同单元格高度的额外逻辑。

我经常使用的另一种方法是让Controller类在View和Model之间进行调解。当您要求表包含不同类型的单元格时,这非常有用;它还使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派生的子类,如上所述。

如果您决定采用这种方式,那么可以使用大量的tableviews及其控制器基础知识示例作为实现这些想法的前言。

enter image description here