【问题标题】:I can't figure out the height for a UITextView for a footer...before TableView frame is set. I'm stumped在设置 TableView 框架之前,我无法确定页脚的 UITextView 的高度。我很难过
【发布时间】:2015-03-08 01:26:25
【问题描述】:

所以我在这里遇到了一些问题。我正在尝试将UITextView 作为UITableViewController 的footerView。

但是,由于根据 UITextView 拥有的数据(在viewDidLoad 中设置),它在运行时可能是不同的文本。所以我永远不知道UITextView 会有多高。它的宽度与 UITableView 相同。

我想如果我得到UITableView 的宽度和TextView 的文本,我可以计算出它应该是的大小。所以我为(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section:写了这段代码

    //get the width of the tableView.
    CGFloat width = self.tableView.frame.size.width;

    //if it's bigger than the screen for some reason, or zero, set it to the screen's width.
    if (width > [[UIScreen mainScreen] bounds].size.width || !width)
        width = [[UIScreen mainScreen] bounds].size.width - 10;

    //get the text from the textView, including attributes.
    NSAttributedString *attributedText = _textView.attributedText;

    //figure out the size it's supposed to be.
    CGRect rect = [attributedText boundingRectWithSize:(CGSize){width, CGFLOAT_MAX}
                                               options:NSStringDrawingUsesLineFragmentOrigin
                                               context:nil];
    CGSize size = rect.size;
    size.height = ceilf(size.height);
    size.width  = ceilf(size.width);


    //return the height, plus a little padding to be safe.
    return size.height + 10;

所以这是丑陋的事情。在调用tableView:heightForFooterInSection: 时,TableView 的框架是一些古怪的数字,例如 600。计算错误,通常太小,UITextView 被返回的低高度切断。

但是,如果我旋转设备,这段代码会再次运行,它工作!所以我知道这段代码很好......如果稍后运行

如果我在任何时候执行[tableView reloadData],它也会修复TableView。只有在第一次加载时它才会被切断。

如果我能想出一种方法来重新加载 tableView once 在它完成加载后,那会解决它,但我不知道该怎么做,这有点像无论如何,hack-y 解决方案。

谁能帮我找出更好的逻辑?我被难住了一段时间。

【问题讨论】:

  • 您是否尝试在 -viewDidAppear: 中调用此代码?或者干脆在-viewDidAppear: 中调用[tableView reloadData]
  • 我确实想到了这个!奇怪的是,它仍然有相同的结果。我必须旋转并旋转回去才能修复它。
  • 如果tableView的宽度等于屏幕的宽度;我会使用屏幕宽度作为参考,或者计算tableView相对于屏幕宽度的宽度作为百分比,以确保每次返回都相同。

标签: ios objective-c iphone uitableview uitextview


【解决方案1】:

-[UIViewController viewDidLayoutSubviews] 中重新加载表格视图。到那时,整个视图层次结构将(或至少应该)拥有最终的、有效的几何图形。

此外,页脚视图与节页脚不同。只有一个页脚视图,它是表格视图上的一个属性。我不会将该文本大小调整代码放在该委托方法中,因为这是明确用于节标题的。

最后,此时表格视图的 bounds 高度是多少?

【讨论】:

  • 这是一个节页脚,不是表格页脚,抱歉。当我将 [tableView reloadData] 放入 viewDidLayoutSubviews 时,我得到一个无限循环。整个事情的方法是:[super viewDidLayoutSubviews]; [self.tableView reloadData];
  • 实际上,这是有道理的,因为表视图是UITableViewController 的根视图。这就是为什么UITableViewController 通常不是一个很好的子类视图控制器的原因之一。表格视图的边界是否正确?
猜你喜欢
  • 2016-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-30
  • 1970-01-01
  • 2013-03-29
  • 2014-02-20
相关资源
最近更新 更多