【问题标题】:How do I layout a UITableViewCell using only frames (no Auto Layout)?如何仅使用框架(无自动布局)布局 UITableViewCell?
【发布时间】:2015-08-15 02:19:31
【问题描述】:

这听起来可能是个愚蠢的问题,但我在 iOS 开发方面的大部分经验都围绕着突出自动布局展开,我现在很好奇(出于性能目的)我将如何在没有 Auto 的情况下布局单元格布局和仅使用框架(可能还有自动调整大小的蒙版)。事实证明,由于自动布局的重要性,这对 Google 来说非常困难。

基本上我是在UITableViewCell 子类的initWithStyle 方法中设置和添加子视图吗?

定位明智,我只是依靠contentViewbounds,然后如果我想要一个视图在另一个视图旁边,我基本上会做newView.frame.origin.x = CGRectGetMaxX(otherView.frame) + spacing 吗?

当我旋转时会发生什么?我知道我可以在viewWillTransitionToSize 中观看旋转,但我该如何重新定位单元格?简单地调用tableView.reloadData() 既昂贵又没有多大作用,因为单元格是在initWithStyle 中布置的,对吗?

我的目标是 iOS 8+。

任何见解都将不胜感激。

【问题讨论】:

    标签: ios objective-c iphone uitableview frame


    【解决方案1】:

    其实它的

    newView.frame.origin.x = CGRectGetMaxX(otherView.frame) + spacing + leftMargin;
    
    // you have to include all the spacing, including margins
    

    提示:

    不要依赖bounds of the contentView默认它设置为320的最大宽度,我建议你使用主屏幕的框架。

    AutoLayout 是我们的朋友,可以为我们节省大量时间。

    如何重新定位单元格?

    如果您打算以编程方式执行此操作,则需要在旋转后设置视图的新高度和宽度。

    调用tableView.reloadData() 来更新单元格中的视图并不昂贵,这就是它的工作原理。我们别无选择,只能忍受它。

    【讨论】:

      【解决方案2】:

      那么框架计算部分最好写在viewDidLayoutSubViews中。

      【讨论】:

      • 你的意思是layoutSubviews?您引用的方法是UIViewController 方法。
      • 如果你在 ViewController 它的 viewDidLayoutSubViews。但是您在 UITableViewCell(UIView 的子类)中,所以您在layoutSubViews 中编写框架计算部分。我的错...:P
      【解决方案3】:

      我不完全确定我理解你的问题。请让我知道这是否有意义:

      添加子视图

      要以编程方式添加子视图,实际上最好在 layoutSubviews 的覆盖中这样做,方法是检查 contentView 是否已经添加了子视图,并在需要时调用一个方法来添加它们。这样,您可以通过情节提要/笔尖或使用 initWithStyle 加载表格单元格。或者,您可以使用在 initWithCoder 和 initWithStyle 中调用的共享 commonInit 方法。

      子视图布局

      要以编程方式布局子视图,您需要覆盖 layoutSubviews(并记得调用 super)并在该方法中设置框架。每当视图更改大小(旋转、初始呈现等)时都会调用此方法,并且将始终包含内容视图的当前边界。要计算您的子视图框架,您可以按照您的建议进行,但您需要定义子视图框架,然后为视图设置框架:

      frameB.origin.x = CGRectGetMaxX(viewA.frame) + spacing;
      viewB.frame = frameB;
      

      请记住,这不会校正 frameB 的宽度。因此,您可能需要考虑改用CGRectDivide()

      滚动性能

      也就是说,在表格视图单元格中使用自动布局时,最大的性能损失是不是自动布局本身,而是对同一组数据进行多次计算以进行布局 -全部在主线程上。例如计算所有文本的框架以相对于彼此布置一堆标签,或者使用 drawRect 而不是在后台线程上绘制到图像位图,然后在绘制完成后将图像加载到 UIImageView 中。在不知道您正在显示什么数据的情况下,很难猜测是什么导致了性能问题,但您应该确保使用分析来确定您是否真的在提高性能。此外,您可能需要考虑将一些数字运算和/或图像渲染移至后台线程。

      祝你好运!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多