通过 UITextView 内容大小调整 UITableView 单元格的大小

发布于 2024-11-18 13:05:09 字数 1544 浏览 0 评论 0原文

我需要一些帮助。 我有一个带有自定义 UITableViewCell 的 UITableView。 在单元格中我有一个 UITextView。 当用户将一些数据输入 UITextView 时,我需要这样做。 UITextView 将根据 UITextView 的内容调整大小。我在 - (void)textViewDidChange:(UITextView *)textView 中实现了它 但现在我还需要调整单元格的大小,如果 UITextView 的内容大小比当前单元格大。

问题是如何通过 UITextView 内容大小调整 UITableView Cell 的大小。

我的代码如下。

@class TableCell;
@interface RootViewController : UITableViewController{
UITableView*tableViewTest;
TableCell *tableCell;
}
@property (nonatomic,retain)IBOutlet TableCell *tableCell;
@property (nonatomic,retain)IBOutlet UITableView*tableViewTest;
@end



- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return 5;
}

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

    static NSString *CellIdentifier = @"Cell";

    TableCell *cell = (TableCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
          [[NSBundle mainBundle] loadNibNamed:@"TableCell" owner:self options:nil];
    cell=tableCell;
    self.tableCell=nil;
}
[cell setTag:indexPath.row+1];

return cell;
 }

- (void)textViewDidChange:(UITextView *)textView
{
CGRect frame = textView.frame;
frame.size.height = textView.contentSize.height;
textView.frame = frame;
NSLog(@"Change=%f",textView.contentSize.height);    
}




@interface TableCell : UITableViewCell <UITextViewDelegate>{
UITextView *textViewTest;
}
@property (nonatomic,retain) IBOutlet UITextView *textViewTest;

感谢您的帮助

I need some help.
I have a UITableView with custom UITableViewCell.
In the Cell I have one UITextView.
I need to do, when the user will type some data into UITextView. UITextView will resize from content of UITextView. I realize it in - (void)textViewDidChange:(UITextView *)textView
But now I need to resize the cell also, if content size of UITextView will bigger then the current Cell.

The question is how to resize UITableView Cell by UITextView contents size.

My code bellow.

@class TableCell;
@interface RootViewController : UITableViewController{
UITableView*tableViewTest;
TableCell *tableCell;
}
@property (nonatomic,retain)IBOutlet TableCell *tableCell;
@property (nonatomic,retain)IBOutlet UITableView*tableViewTest;
@end



- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return 5;
}

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

    static NSString *CellIdentifier = @"Cell";

    TableCell *cell = (TableCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
          [[NSBundle mainBundle] loadNibNamed:@"TableCell" owner:self options:nil];
    cell=tableCell;
    self.tableCell=nil;
}
[cell setTag:indexPath.row+1];

return cell;
 }

- (void)textViewDidChange:(UITextView *)textView
{
CGRect frame = textView.frame;
frame.size.height = textView.contentSize.height;
textView.frame = frame;
NSLog(@"Change=%f",textView.contentSize.height);    
}




@interface TableCell : UITableViewCell <UITextViewDelegate>{
UITextView *textViewTest;
}
@property (nonatomic,retain) IBOutlet UITextView *textViewTest;

Thanks for help

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

蓝礼 2024-11-25 13:05:09

不要调用 reloadData,而是使用 [table beginUpdates] 东西

Don't call reloadData, instead use [table beginUpdates] stuff

冷情 2024-11-25 13:05:09

在 UITableViewDelegate 中,您可以通过函数调整单元格高度

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
// do your stuff here like resize your cell height 
}

,之后为了反映视图中的变化,您需要重新加载表格

[self.table reloadData];

,如果表格中有部分,那么您不需要重新加载整个表格并避免视图中的闪烁,您只需重新加载该部分您通过该单元格的索引路径执行高度更改的表格的特定部分您还可以使用其他方式来查找所需的单元格,这是我查找需要重新加载的单元格的风格

NSIndexPath *ip = [self.table indexPathForCell:cell];
[self.table reloadSections:[NSIndexSet indexSetWithIndex:ip.section] withRowAnimation:UITableViewRowAnimationAutomatic];

in UITableViewDelegate you can resize your cell height by function

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
// do your stuff here like resize your cell height 
}

and after that for reflecting the change in view you need to reload table by

[self.table reloadData];

and if you have section in your table then you need not to reload whole table and avoid flickering in view you just reload that specific section of table for which you perform change in height by indexpath of that cell you can also use some other way to find the desired cell here is my style to find the cell which i need to reload

NSIndexPath *ip = [self.table indexPathForCell:cell];
[self.table reloadSections:[NSIndexSet indexSetWithIndex:ip.section] withRowAnimation:UITableViewRowAnimationAutomatic];
心意如水 2024-11-25 13:05:09

老问题,但如果仍在寻找这个问题的答案,一些自动布局魔法可能会对某人有所帮助。

如果一切设置正确(自动布局约束),您不必自己计算任何内容。

您所要做的就是禁用 UITextView 的滚动启用属性,然后在 textViewDidChange 上调用 tableView.beginUpdates() 和 tableView.endUpdates() 。

有关详细说明,请查看

Old question but some Auto Layout magic might help someone if still looking for the answer to this.

If everything is set up properly (Auto Layout constraints) you do not have to calculate anything yourself.

All you have to do is disable UITextView's scrolling enabled property then on textViewDidChange call tableView.beginUpdates() and tableView.endUpdates().

For a detailed explanation, check out a post I wrote which also includes a working sample project.

踏雪无痕 2024-11-25 13:05:09

您只能通过实现其委托来增加自定义UITableViewCell的高度heightForRowAtIndexPath:

当 cell 的 textView 大于 cell height 时,需要调用 UITableView 上的 reloadData 方法实例和 heightForRowAtIndexPath: 函数必须返回扩展单元格的正确高度。

You can only increase the height of custom UITableViewCell by implementation it's delegate heightForRowAtIndexPath:

When cell's textView grow bigger then cell height , you need to call reloadData method on UITableView instance and heightForRowAtIndexPath: function must return the correct height for the extended cell.

酷遇一生 2024-11-25 13:05:09

UITableViewDelegate 协议定义:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;

它允许您指定每个单元格的高度。 UITextView 将为每个可见单元格调用数据源。您可以通过调用 UITableViewreloadData 来触发此操作

The UITableViewDelegate protocol defines:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;

Which allows you to specify the heigh of each cell. The UITextView will call the data source for every visible cell. You can trigger this by calling UITableView's reloadData

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文