gpt4 book ai didi

iphone - 调整 UITableView 标题的大小并包含 UITextView (iOS7 + AutoLayout)

转载 作者:技术小花猫 更新时间:2023-10-29 10:57:24 26 4
gpt4 key购买 nike

我现在已经为此苦苦挣扎了一段时间,我想确保我以正确的方式做这件事。作为引用,我将 AutoLayout 与 Storyboards 一起使用,它是一个仅限 iOS7 的应用程序。

我有一个带有页眉 View 的 UITableView,并且 HeaderView 的 UI 连接在 Storyboard 中。我将标题留在 Storyboard中,它包含一些元素,其中之一是不可滚动的 UITextView。

这是它在 Storyboard 中的基本外观的屏幕截图:

screenshot

我将 header-view 的背景变暗为深灰色,以使其突出。

UITextView 的文本可以是动态的,因此它的高度需要根据文本的大小而改变。但棘手的部分是表格的标题 View 也需要根据文本的大小调整其高度。我已经尝试了一些带有约束的不同方法,但它并没有真正正常工作(除非我禁用 AutoLayout 并以编程方式重新调整大小,我真的很想避免这种情况)。

当然,我希望它尽可能干净,代码尽可能少。我不依赖于使用 TableView header ,尽管它可以很好地满足我的需求,因为我希望它及其包含的 TextView 随着下面的实际详细信息滚动。但话虽如此,如果有更简单的方法来实现这一点(即使用 uilabel),我会很乐意更改底层结构。

关于方法有什么想法吗?不是通过一个答案来寻找牵着我手的人;如果可能的话,主要是寻找一些好的起点。提前致谢!

最佳答案

前段时间我找到了新的解决方案,也许它需要调整动画并且是实验性的,但是,对于某些范围的情况来说它很好,所以试一试:

  1. 将 headerView 添加到 UITableView。
  2. 向 headerView 添加一个 subview ,我们称它为包装器。
  3. 让 wrapper 的高度随其 subview 调整(通过 Auto布局)。
  4. 当 autolayout 完成布局后,将 headerView 的高度设置为 wrapper 的高度。 (参见 -updateTableViewHeaderViewHeight)
  5. 重新设置 headerView。 (参见-resetTableViewHeaderView)

这是一些代码:

- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];

[self updateTableViewHeaderViewHeight];
}

/**
tableView's tableViewHeaderView contains wrapper view, which height is evaluated
with Auto Layout. Here I use evaluated height and update tableView's
tableViewHeaderView's frame.

New height for tableViewHeaderView is applied not without magic, that's why
I call -resetTableViewHeaderView.
And again, this doesn't work due to some internals of UITableView,
so -resetTableViewHeaderView call is scheduled in the main run loop.
*/
- (void)updateTableViewHeaderViewHeight
{
// get height of the wrapper and apply it to a header
CGRect Frame = self.tableView.tableHeaderView.frame;
Frame.size.height = self.tableHeaderViewWrapper.frame.size.height;
self.tableView.tableHeaderView.frame = Frame;

// this magic applies the above changes
// note, that if you won't schedule this call to the next run loop iteration
// you'll get and error
// so, I guess that's not a clean solution and could be wrapped in @try@catch block
[self performSelector:@selector(resetTableViewHeaderView) withObject:self afterDelay:0];
}

// yeah, guess there's something special in the setter
- (void)resetTableViewHeaderView
{
// whew, this could be animated!
[UIView beginAnimations:@"tableHeaderView" context:nil];

self.tableView.tableHeaderView = self.tableView.tableHeaderView;

[UIView commitAnimations];
}

所有这一切都在初始自动布局通过后无缝运行。稍后,如果您更改包装器的内容以使其获得不同的高度,它将由于某种原因而无法工作(猜测布局 UILabel 需要多次自动布局传递或其他)。我通过在下一次运行循环迭代中为 ViewController 的 View 安排 setNeedsLayout 解决了这个问题。

我为此创建了示例项目:TableHeaderView+Autolayout .

关于iphone - 调整 UITableView 标题的大小并包含 UITextView (iOS7 + AutoLayout),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19433332/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com