【问题标题】:Initial lag for a cell with a UITextView具有 UITextView 的单元格的初始滞后
【发布时间】:2017-08-14 17:05:59
【问题描述】:

当前设置

我有一个自定义单元格,从 xib 加载,其中大部分空间都被 UITextview 覆盖。此外,该单元格可能有一些文本视图。这个单元格内还有一些元素(一个 UIView + 2 个 UILabel)。

问题

即使我只有一个文本视图,我也尝试删除所有这些视图和延迟。此外,这种滞后只是第一次发生。稍后,当我向下滚动并遇到另一个带有 textview 的单元格时,根本不会发生延迟。

其他信息

这个自定义单元格的作用是在UIStackView 中添加了一个文本视图。一开始,stackview 是空的,因为我不知道(在开发时)可能/应该有多少文本视图。

我知道这是另一件可能会影响性能的事情,但我已经解决了这个问题(我想尽其所能),方法是在对单元格出列时检查 stackview 的 arrangedSubviews 数组中已经找到了多少文本视图,并基于该信息,我只是适当地添加或隐藏视图(而不是每次都销毁和重新创建所需数量的文本视图)。

我曾尝试使用 Instruments,但我没有注意到我的任何类都占用 CPU 时间,而是框架内部调用的一些 UIKit 方法调用是导致此问题的原因...如果需要,我可以发布截图,但我想这不相关,因为那些似乎是通常的系统和框架调用。另外,我正在 iPad 2 上进行测试:D 所以也许这是一件事(我必须针对慢速设备优化应用程序)。

不过,我想我可以通过某种方式对其进行优化?

MyCell 类比较简单(伪代码):

class MyCell:UITableViewCell{

    func configure(data:SomeData){

        self.addOrHideViewsIfNeeded()
    }

    private func addOrHideViewsIfNeeded(){
        //here, I check if stackview.arrangedSubviews has, and how many subviews are there, and
        //add / hide them appropriately, means if I have to add them, I load them from the nib, otherwise, I reuse views from by adding them/removing them from a pool.
    }
}

与发布版本相比,Debug 版本的延迟更明显,这是有道理的,但仍然很明显。

【问题讨论】:

  • 哦,是的,文本视图最初是从笔尖加载的,并且使用系统字体而不是自定义字体。
  • 我不认为这是由于UITextView。根据我的经验,以及可以在线阅读的内容,UIStackView 虽然非常方便,但性能很差。复杂的 AutoLayout 规则也需要一些时间来计算。在我们的应用程序中,一个单元格上有大约 20 个组件,并且有很多限制,即使在较新的设备上也存在明显的滞后。我们通过切换到手动布局解决了这个问题 - 我们在单元格layoutSubviews 中自己计算帧。虽然我意识到这可能意味着对您的代码进行大量更改,但可能值得一试。
  • @Losiowaty 好吧,我的表格视图中有不同类型的单元格。每个单元格内部都有 uistackview。只有具有文本视图的单元格第一次滞后。但正如我所说,滞后来自 Mac 的硬盘,而附加在调试器上。当应用程序未通过 USB 电缆连接时,没有(可见的)滞后。但是,是的,堆栈视图并不是那么高效。
  • 我在一个单元格中有一个滞后的动画 UIImageView 并且确实绘制了一个不可见的零行来进行预加载。也许类似的方法适用于您的情况。
  • @Kamil.SI 之前做过类似的事情(viewDidLoad 中的 iirc )并且它有效,但我想我可能会在没有预加载的情况下得到并想弄清楚为什么会发生延迟......但我想知道您到底在想什么(例如,采用哪种方法,同步/异步等...)?你能写一个例子吗? ——

标签: ios swift ipad uitextview instruments


【解决方案1】:

您可能需要检查您是否在重复使用这些单元格。

你可以像下面这样重复使用它:

-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NAIndexPath *) indexPath{

static NSString *cellIdentifier = @"Mycell";

cell = [tableView dequeueCellWithIdentifier:cellIdentifier];

if(cell == nil)
    cell = [[MyCell alloc] initWithStyle: UITableViewCellStyleDefault    reuseIdentifier: cellIdentifier];
 }

【讨论】:

  • 我在viewDidLoad() 中使用tableview 的register(_ nib:UINib?, forCellReuseIdentifier identifier:String) 注册了笔尖。另外,我在cellForRowAt 委托方法中放置了一个断点,并且单元格不是零,而是正确地出列。问题是,只有在我使用 Debugger 时才会出现延迟。我弄错了,当我在发布模式下在实际设备上构建运行应用程序而不将其连接到调试器时没有延迟。但是你有我的支持,因为你的回答总体上可能会有所帮助。
【解决方案2】:

好的,这是我的想法的草图,从用户角度 tableview 行零进行预加载。

class MyCell : UITableViewCell {
    static var initiallyPreloaded : Bool = false

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)

        if !MyCell.initiallyPreloaded {
//Do the initial preloading setup by adding UITextView to self.contentView
            MyCell.initiallyPreloaded = true
        } else {
//Setup the regular cell content otherwise
        }
    }
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
}

class ViewController: UIViewController , UITableViewDelegate {
    func tableView(_ tableView: UITableView,
                   cellForRowAt indexPath: IndexPath) -> UITableViewCell{
        var cell: MyCell? = tableView.dequeueReusableCell(withIdentifier: "myCellIdentifier") as! MyCell?
        if cell == nil {
            cell = MyCell(style: .default, reuseIdentifier: "myCellIdentifier")
        }
        if indexPath.row == 0 {
//Display the initial cell in unnoticeable to user way (start with hidden/alpha zero)
//For this zero-th row the initial preloading should happen
        }
        return cell!
    }
}

【讨论】:

  • 我只需要在单元格初始化时添加UITextView,而不是在单元格初始化后添加。我也必须在awakeFromNib() 中执行此操作,因为我正在访问单元格网点(文本视图实际上并未添加到contentView,而是添加到我在问题中提到的stackview)。因此,不需要隐形细胞。不管怎样,你帮我找到了解决问题的办法。
  • 很高兴听到。就我而言,我正在开始一个不可见的动画,通常会滞后于第一次出现。如果您使用的是界面生成器,那么正确的awakeFromNib() 是一种方法。
猜你喜欢
  • 2021-05-29
  • 1970-01-01
  • 2018-08-30
  • 2012-12-19
  • 2016-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多