【问题标题】:iOS - Scroll TextView to top when it's in a tableview celliOS - 在表格视图单元格中时将 TextView 滚动到顶部
【发布时间】:2017-02-08 05:59:42
【问题描述】:

我在自定义TableView 单元格中有一个UITextView。我希望文本视图默认滚动到顶部。我通常在常规视图中这样做:

override func viewDidLayoutSubviews() {

    super.viewDidLayoutSubviews()
    let fixedWidth = bioView.frame.size.width
    bioView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.greatestFiniteMagnitude))
    let newSize = bioView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.greatestFiniteMagnitude))
    var newFrame = bioView.frame
    newFrame.size = CGSize(width: max(newSize.width, fixedWidth), height: newSize.height)
    bioView.frame = newFrame;
    bioView.scrollRangeToVisible(NSRange(location:0, length:0))
}

bioView 是我的文本视图对象。但是,这在我的情况下不起作用,因为我无法在ViewController 类中引用textview,只能在CustomCell 类中这样做,并且该类不能覆盖viewDidLayoutSubviews。有什么帮助吗?

【问题讨论】:

  • 由于所有单元格都被重用,您不能在视图控制器中引用自定义单元格对象并从那里访问 textview 等吗?
  • 现在试过了,没用k :(

标签: ios swift uitableview uitextview


【解决方案1】:

试试这个。

-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CustomCell* cell = [tableView dequeueReusableCellWithIdentifier:@"CustomCell"];
    [cell.textView scrollRangeToVisible:NSMakeRange(0, 0)];
    return cell;
}

斯威夫特 3.0:

    let cell = tableView.dequeueReusableCell(withIdentifier: "CustomCell", for: indexPath) as! DemoCell
    cell.textView.scrollRangeToVisible(NSRange(location:0, length:0))

有效!但是,表格必须滚动才能使更改生效,这是我迄今为止找到的最佳方式。谢谢大家!

【讨论】:

  • 感谢您的回答,也没有用:(还有其他想法吗?
  • 我试过了,它工作正常,我可能把你的问题理解错了。
【解决方案2】:

在处理UITableViewDelegate 事件的视图控制器中,覆盖willDisplayCell 方法。从 Cell 中识别你的 textView 并编写代码进行滚动。

【讨论】:

  • 感谢您的回复,我没有找到“willDisplayCell”,我尝试在 cellForRowAt 方法上执行此操作,但它也不起作用。我什至创建了对单元格的引用并在 viewDidLayoutSubviews 中使用了它,但也没有用。还有其他想法吗?真的很感激!
  • 这是 Swift 中函数的名称:func tableView(UITableView, willDisplay: UITableViewCell, forRowAt: IndexPath)
【解决方案3】:

我已尝试使用scrollRangeToVisible() 或在awakeFromNibwillDisplayCellcellForRowAtIndexPath 中将contentOffset 设置为.zero 进行滚动。这些都被执行了,但是在这之后的某个时间,滚动仍然被重置(通过 AutoLayout?)。

对于出现 UITableView 时屏幕上的单元格,在 willDisplayCell 中执行滚动不会“粘滞”。它确实如果单元格被滚动出去并在屏幕上滚动回来。

对于一个已经在屏幕上的单元格,它的 UITextView 带有“太多”文本,因此它会滚动到 TextView 的底部,我发现让文本滚动到顶部的唯一方法是设置UITableViewController 的viewDidAppear() 中的scrollRangeToVisible()contentOffset。即使viewWillAppear() 也不起作用。

一个缺点是,这种解决方案会在 TableView 出现在屏幕上后导致滚动位置发生跳转,即使在 performWithoutAnimation 块中也是如此。

您可以将代码放在viewDidLayoutSubviews 中,它会起作用,但如上所述,这会被多次调用,并且每次方向更改时文本都会滚动回顶部,这可能是不可取的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-18
    相关资源
    最近更新 更多