【问题标题】:iOS storyboard: how to handle dynamic, floating content?iOS 故事板:如何处理动态、浮动的内容?
【发布时间】:2011-12-09 05:10:56
【问题描述】:

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

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

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

【问题讨论】:

    标签: objective-c cocoa-touch uistoryboard


    【解决方案1】:

    有很多不同的方法可以解决这个问题。最终,您可以在运行时控制任何这些元素的大小。从用户体验的角度来看,您可能希望至少保持一些元素的大小固定(例如,代表新闻项目总大小的图像和滚动视图)。这将留下标题和细节的相对大小。如果要显示整个标题,可以使用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 及其控制器基础知识的示例作为实现这些想法的前言。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-21
      • 2010-12-18
      • 2017-02-20
      • 1970-01-01
      • 2011-01-28
      • 1970-01-01
      • 1970-01-01
      • 2015-11-07
      相关资源
      最近更新 更多