当前位置: 首页 > 知识库问答 >
问题:

UITableViewCell与UITextView高度在iOS7?

汝岳
2023-03-14

如何在 iOS 7 中计算带有 UI 文本视图的 UI 表查看器的高度?

我找到了很多类似问题的答案,但是< code>sizeWithFont:参与了每一个解决方案,这个方法已经被否决了!

我知道我必须使用-(CGFloat)tableView: heightForRowAtIndexPath:但是如何计算我的TextView显示整个文本所需的高度呢?

共有3个答案

魏安宁
2023-03-14

如果你正在使用UITableViewAutomaticDimension,我有一个非常简单的解决方案(仅限iOS 8)。在我的例子中,它是一个静态的表格视图,但是我想你可以将它用于动态原型...

我有一个文本视图高度的约束出口,我已经实现了如下方法

// Outlets

@property (weak, nonatomic) IBOutlet UITextView *textView;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *textViewHeight;


// Implementation

#pragma mark - Private Methods

- (void)updateTextViewHeight {
    self.textViewHeight.constant = self.textView.contentSize.height + self.textView.contentInset.top + self.textView.contentInset.bottom;
}

#pragma mark - View Controller Overrides

- (void)viewDidLoad {
    [super viewDidLoad];
    [self updateTextViewHeight];
}

#pragma mark - TableView Delegate & Datasource

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 80;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return UITableViewAutomaticDimension;
}

#pragma mark - TextViewDelegate

- (void)textViewDidChange:(UITextView *)textView {
    [self.tableView beginUpdates];
    [self updateTextViewHeight];
    [self.tableView endUpdates];
}

但请记住:文本视图必须是可滚动的,并且必须设置约束,使其适用于自动标注:

    < li >以固定的高度(包括文本视图高度,您将通过编程更改该高度)设置单元格中所有彼此相关的视图 < li >与超级视图相比,最上面的视图具有顶部间距,最下面的视图具有底部间距;

最基本的细胞例子是:

  • 单元格中除了文本视图没有其他视图
  • 文本视图所有边的0边距和文本视图的预定义高度约束。
唐茂实
2023-03-14

有一个新函数可以替换sizeWithFont,它是boundingRectWithSize。

我在我的项目中添加了以下函数,它利用了iOS7上的新函数和低于7的iOS上的旧函数。它的语法与sizeWithFont基本相同:

    -(CGSize)text:(NSString*)text sizeWithFont:(UIFont*)font constrainedToSize:(CGSize)size{
        if(IOS_NEWER_OR_EQUAL_TO_7){
            NSDictionary *attributesDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                                              font, NSFontAttributeName,
                                              nil];

            CGRect frame = [text boundingRectWithSize:size
                                              options:(NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading)
                                           attributes:attributesDictionary
                                              context:nil];

            return frame.size;
        }else{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
            return [text sizeWithFont:font constrainedToSize:size];
#pragma clang diagnostic pop
        }
    }

您可以在前缀上添加IOS_NEWER_OR_EQUAL_TO_7。项目中的pch文件为:

#define IOS_NEWER_OR_EQUAL_TO_7 ( [ [ [ UIDevice currentDevice ] systemVersion ] floatValue ] >= 7.0 )
汪理
2023-03-14

首先,非常重要的是要注意,在文本的呈现方式方面,UITextView和UILabel之间存在很大差异。UITextView 不仅在所有边框上都有插图,而且它里面的文本布局也略有不同。

因此,sizeWithFont:对于UITextViews来说是一个糟糕的方法。

取而代之的是UITextView本身有一个名为sizeThatFits:的函数,它将返回在您可以指定的边界框内显示UITextView的所有内容所需的最小大小。

以下内容将同样适用于iOS 7和旧版本,并且截至目前不包括任何已弃用的方法。

- (CGFloat)textViewHeightForAttributedText: (NSAttributedString*)text andWidth: (CGFloat)width {
    UITextView *calculationView = [[UITextView alloc] init];
    [calculationView setAttributedText:text];
    CGSize size = [calculationView sizeThatFits:CGSizeMake(width, FLT_MAX)];
    return size.height;
}

此函数将采用 NS 属性字符串和所需宽度作为 CG 浮动,并返回所需的高度

由于我最近做了类似的事情,我想我也会分享一些解决我遇到的相关问题的方法。我希望它能帮助一些人。

这要深入得多,将涵盖以下内容:

  • 当然:根据显示所包含的 UI 文本视图的完整内容所需的大小来设置 UI 表查看器的高度
  • 响应文本更改(并对行的高度更改进行动画处理)
  • 将光标保持在可见区域内,并在编辑时调整 UI 表视图大小时将第一响应者保留在 UITextView

如果您使用的是静态表视图,或者您只有已知数量的UITextView,那么您可以简化步骤2。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    // check here, if it is one of the cells, that needs to be resized
    // to the size of the contained UITextView
    if (  )             
        return [self textViewHeightForRowAtIndexPath:indexPath];
    else
    // return your normal height here:
            return 100.0;           
}

NSMutableDictionary(在本例中称为textViews>)作为实例变量添加到

使用此字典可以存储对各个 UITextView 的引用,如下所示:

(是的,索引路径是字典的有效键)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    
    // Do you cell configuring ...

    [textViews setObject:cell.textView forKey:indexPath];
    [cell.textView setDelegate: self]; // Needed for step 3

    return cell;
}

此函数现在将计算实际高度:

- (CGFloat)textViewHeightForRowAtIndexPath: (NSIndexPath*)indexPath {
    UITextView *calculationView = [textViews objectForKey: indexPath];
    CGFloat textViewWidth = calculationView.frame.size.width;
    if (!calculationView.attributedText) {
        // This will be needed on load, when the text view is not inited yet
        
        calculationView = [[UITextView alloc] init];
        calculationView.attributedText = // get the text from your datasource add attributes and insert here
        textViewWidth = 290.0; // Insert the width of your UITextViews or include calculations to set it accordingly
    }
    CGSize size = [calculationView sizeThatFits:CGSizeMake(textViewWidth, FLT_MAX)];
    return size.height;
}

对于接下来的两个函数,重要的是将< code>UITextViews的委托设置为您的< code > UITableViewController 。如果您需要其他东西作为委托,您可以通过从那里进行相关的调用或者使用适当的NSNotificationCenter钩子来解决它。

- (void)textViewDidChange:(UITextView *)textView {

    [self.tableView beginUpdates]; // This will cause an animated update of
    [self.tableView endUpdates];   // the height of your UITableViewCell

    // If the UITextView is not automatically resized (e.g. through autolayout 
    // constraints), resize it here

    [self scrollToCursorForTextView:textView]; // OPTIONAL: Follow cursor
}
- (void)textViewDidBeginEditing:(UITextView *)textView {
    [self scrollToCursorForTextView:textView];
}

这将使 UITableView 滚动到光标的位置(如果它不在 UITableView 的可见矩形内):

- (void)scrollToCursorForTextView: (UITextView*)textView {
    
    CGRect cursorRect = [textView caretRectForPosition:textView.selectedTextRange.start];
    
    cursorRect = [self.tableView convertRect:cursorRect fromView:textView];
    
    if (![self rectVisible:cursorRect]) {
        cursorRect.size.height += 8; // To add some space underneath the cursor
        [self.tableView scrollRectToVisible:cursorRect animated:YES];
    }
}

在编辑时,键盘可能会覆盖 UITableView 的某些部分。如果未调整表视图插图,则滚动到“浏览”对于文本视图:(如果光标位于表视图的底部),则将无法滚动到光标。

- (void)keyboardWillShow:(NSNotification*)aNotification {
    NSDictionary* info = [aNotification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
    
    UIEdgeInsets contentInsets = UIEdgeInsetsMake(self.tableView.contentInset.top, 0.0, kbSize.height, 0.0);
    self.tableView.contentInset = contentInsets;
    self.tableView.scrollIndicatorInsets = contentInsets;
}

- (void)keyboardWillHide:(NSNotification*)aNotification {
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.35];
    UIEdgeInsets contentInsets = UIEdgeInsetsMake(self.tableView.contentInset.top, 0.0, 0.0, 0.0);
    self.tableView.contentInset = contentInsets;
    self.tableView.scrollIndicatorInsets = contentInsets;
    [UIView commitAnimations];
}

最后一部分:

在您的视图中加载,通过NSNotificationCenter注册键盘更改通知:

- (void)viewDidLoad
{
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
}

正如Dave Haupert指出的,我忘记包含< code>rectVisible函数:

- (BOOL)rectVisible: (CGRect)rect {
    CGRect visibleRect;
    visibleRect.origin = self.tableView.contentOffset;
    visibleRect.origin.y += self.tableView.contentInset.top;
    visibleRect.size = self.tableView.bounds.size;
    visibleRect.size.height -= self.tableView.contentInset.top + self.tableView.contentInset.bottom;
    
    return CGRectContainsRect(visibleRect, rect);
}

我还注意到,scrollToCursorForTextView:仍然包含对我项目中的TextFields之一的直接引用。如果您有找不到body TextView的问题,请检查该函数的更新版本。

 类似资料:
  • 我有一个包含一个。我想调整文本视图的大小,以便在给定固定宽度的情况下,显示整个字符串而不滚动。 有一个方法,允许为给定大小计算其边框 但不幸的是,它似乎不起作用,因为它总是返回单行的高度。

  • DynamicHeights是一个动态表格元素高度(动态TableViewCell)的例子。实际应用场景在iOS开发中会经常遇到不规律的TableViewCell,往往需要根据内容的多少而动态调整这些Cell的大小。在http://www.cimgf.com/2009/09/23/uitableviewcell-dynamic-height/ 中,有详细的解说开发的流程以及这么处理的原因。里面的大

  • 问题内容: 我有一个表格视图,其中包含一个webView的单元格,我希望该单元格的高度与该webView的高度相匹配。 这是我使用的代码: 结果是这样的:https : //postimg.cc/image/8qew1lqjj/ 该webView是正确的高度,但单元格不是,如何解决此问题? 问题答案: TableView会自动调整单元格的大小,您只需要实现委托方法即可。 是的,您最初并不知道Web

  • 问题内容: 如您在这张图片中看到的 将根据文本长度它的高度的变化,我想让它根据文本长度调节它的高度。 *我看到了其他问题,但是那里的解决方案对我没有用 问题答案: 这个 作品 对我来说,所有其他解决方案都没有。 在Swift 4中,的语法已更改为。

  • 组件的高度和宽度决定了其在屏幕上显示的尺寸。 指定宽高 最简单的给组件设定尺寸的方式就是在样式中指定固定的 width 和 height 。React Native 中的尺寸都是无单位的,表示的是与设备像素密度无关的逻辑像素点。 export default class HelloWorld extends Component { render() { return ( <

  • iOS 8为tableViews引入了一种基于内容自动调整单元格高度的方式(通过AutoLayout)。 我已经开始处理标签、图像等了。 但是,我想不出一种方法,让表格视图单元格在单元格的文本视图发生变化时自动增长? 关于设置的更多信息:单元格内的UITextView对表视图单元格的contentView有水平和垂直约束。我还禁用了文本视图的滚动。 我还尝试手动更改单元格的高度约束,但单元格也不会