的UITableViewCell与iOS的7 UITextView的高度?的UITableViewC

2019-05-08 18:40发布

我如何计算的UITableViewCell的高度与它的iOS 7的UITextView的?

我发现了很多类似的问题的答案,但sizeWithFont:参与在每一个解决方案,这种方法已过时!

我知道我必须使用- (CGFloat)tableView:heightForRowAtIndexPath:但我怎么计算我的TextView需要显示整个文本的高度?

Answer 1:

首先,它是要注意非常重要的,有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;
}

该函数将需要NSAttributedString和所需宽度作为CGFloat ,并返回所需要的高度


详细的解决方案

因为我最近做类似的事情,我想我也会分享一些解决方案,我所遇到的相关问题。 我希望这会帮助别人。

这是更为深入,将包括以下内容:

  • 当然:设置高度UITableViewCell基于以显示包含的全部内容所需要的大小UITextView
  • 响应文本更改(和动画行的高度变化)
  • 保持光标可见区域内,并保持第一响应上UITextView调整大小时UITableViewCell在编辑

如果您使用的是静态表视图中工作,或者你只有一个已知数量的UITextView S,可以潜在地使第2步简单得多。

1.首先,覆盖heightForRowAtIndexPath:

- (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;           
}

2.定义所计算所需高度的函数:

添加NSMutableDictionary (在这个例子叫textViews )作为一个实例变量到你UITableViewController子类。

使用这本字典存储个别引用UITextViews像这样:

(是的, indexPaths是有效的密钥字典 )

- (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;
}

3.启用而编辑调整大小

在接下来的两个功能,这一点很重要,那的代表UITextViews设为您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
}

4.按照光标同时编辑

- (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];
    }
}

5.调整可见矩形,通过设置插图

当编辑,您的部分UITableView可以通过键盘覆盖。 如果tableviews插图不作调整, scrollToCursorForTextView:将无法滚动到你的光标,如果它是在的tableview的底部。

- (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];
}

请不要生我的气,为了使这个答案这么久。 虽然不是所有的它是需要回答的问题,我认为有其他人谁是这些直接相关的问题将有助于。


更新:

戴维Haupert指出,我忘了包括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:还包括直接引用我的项目中TextField的一个。 如果你有一个问题bodyTextView没有被发现,检查功能的更新版本。



Answer 2:

有一个新的功能,以取代sizeWithFont,这是boundingRectWithSize。

我增加了以下功能到我的项目,它利用上iOS7的新功能和iOS比7下旧它具有基本相同的语法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您prefix.pch文件在您的项目为:

#define IOS_NEWER_OR_EQUAL_TO_7 ( [ [ [ UIDevice currentDevice ] systemVersion ] floatValue ] >= 7.0 )


Answer 3:

如果您使用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];
}

但要记住 :文本视图必须是滚动的,你必须设置你的约束,他们为自动维工作:

  • 设置所有在相对于彼此的单元的图,其中固定的高度(包括文本视图的高度,这你将编程修改)
  • 最顶部的视图具有顶部间距和底部最视图具有底部间隔到超视图;

最基本的细胞的例子是:

  • 在小区中没有其它视图除了TextView的
  • 0利润围绕文本视图和文本视图中的预定高度约束的四面八方。


Answer 4:

蒂姆Bodeit的答案是伟大的。 我用简单的解决方案的代码,以获得正确的文本视图的高度,并使用高度heightForRowAtIndexPath 。 但我不使用应答的休息来调整文本视图。 相反,我写的代码来改变frame在文本视图中cellForRowAtIndexPath

一切工作在IOS 6及以下,但在IOS 7在文本视图的文本不能被完全示出,即使frame文本视图的确实调整大小。 (我不使用Auto Layout )。 它应该在的iOS 7有原因TextKit和文本的位置由控制NSTextContainerUITextView 。 所以,在我的情况,我需要添加一行来设置someTextView ,以使其在iOS的7正常工作。

    if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
        someTextView.textContainer.heightTracksTextView = YES;
    }

由于文档说,这是什么性质的作用是:

控制接收机是否调整其边界矩形的高度时,其文本视图被调整大小。 默认值:NO。

如果使用默认值,离开它,调整后framesomeTextView的大小textContainer没有改变,导致的结果是,该文本只能调整之前显示在该地区。

也许这是设置需要scrollEnabled = NO的情况下,有不止一个textContainer ,使文本将回流从一个textContainer到另一个。



Answer 5:

这里是一个更解决方案,旨在简化和快速原型

建立:

  1. 表原型细胞。
  2. 每个单元包含动态尺寸UITextView瓦特/其他内容。
  3. 原型细胞与相关TableCell.h
  4. UITableView与相关TableViewController.h

解:

(1)添加到TableViewController.m

 // This is the method that determines the height of each cell.  
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    // I am using a helper method here to get the text at a given cell.
    NSString *text = [self getTextAtIndex:indexPath];

    // Getting the height needed by the dynamic text view.
    CGSize size = [self frameForText:text sizeWithFont:nil constrainedToSize:CGSizeMake(300.f, CGFLOAT_MAX)];

    // Return the size of the current row.
    // 80 is the minimum height! Update accordingly - or else, cells are going to be too thin.
    return size.height + 80; 
}

// Think of this as some utility function that given text, calculates how much 
// space would be needed to fit that text.
- (CGSize)frameForText:(NSString *)text sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size
{
    NSDictionary *attributesDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                                          font, NSFontAttributeName,
                                          nil];
    CGRect frame = [text boundingRectWithSize:size
                                      options:(NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading)
                                   attributes:attributesDictionary
                                      context:nil];

    // This contains both height and width, but we really care about height.
    return frame.size;
}

// Think of this as a source for the text to be rendered in the text view. 
// I used a dictionary to map indexPath to some dynamically fetched text.
- (NSString *) getTextAtIndex: (NSIndexPath *) indexPath
{
    return @"This is stubbed text - update it to return the text of the text view.";
}

(2)添加到TableCell.m

// This method will be called when the cell is initialized from the storyboard
// prototype. 
- (void)awakeFromNib
{
    // Assuming TextView here is the text view in the cell. 
    TextView.scrollEnabled = YES;
}

说明:

因此,这里发生了什么是这样的:每个文本视图绑定到由垂直和水平的限制表单元格的高度 - 这意味着当表格单元格高度增加,文中观点增加其大小为好。 我用的@ manecosta的代码修改后的版本来计算文本视图所需要的高度,以适应单元格中的给定文本。 因此,这意味着给出字符的X个文本, frameForText:将返回其尺寸将有一个属性size.height相匹配的文本视图的要求的高度。

现在,剩下的工作就是更新单元格的高度符合该要求的文本视图的高度。 而这种情况下实现heightForRowAtIndexPath: 正如在评论中指出,由于size.height只对文本视图的高度,而不是整个小区,应该有一定的偏移量添加到它。 在该示例的情况下,此值是80。



Answer 6:

如果你使用的自动布局的一种方法是让自动版式引擎计算大小为您服务。 这是不是最有效的方法,但它是非常方便(可以说是最准确)。 它随着该小区布局的复杂性变得更方便 - 例如,你突然有两个或两个以上textviews /字段中的单元格。

我回答过类似的问题与使用自动布局,这里大小的tableview细胞完整的示例:

如何调整上海华以适应自动布局所有子视图?



Answer 7:

完整的平滑方案如下。

首先,我们需要的细胞类一个TextView

@protocol TextInputTableViewCellDelegate <NSObject>
@optional
- (void)textInputTableViewCellTextWillChange:(TextInputTableViewCell *)cell;
- (void)textInputTableViewCellTextDidChange:(TextInputTableViewCell *)cell;
@end

@interface TextInputTableViewCell : UITableViewCell
@property (nonatomic, weak) id<TextInputTableViewCellDelegate> delegate;
@property (nonatomic, readonly) UITextView *textView;
@property (nonatomic) NSInteger minLines;
@property (nonatomic) CGFloat lastRelativeFrameOriginY;
@end


#import "TextInputTableViewCell.h"

@interface TextInputTableViewCell () <UITextViewDelegate> {
    NSLayoutConstraint *_heightConstraint;
}
@property (nonatomic) UITextView *textView;
@end

@implementation TextInputTableViewCell

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        self.selectionStyle = UITableViewCellSelectionStyleNone;

        _textView = [UITextView new];
        _textView.translatesAutoresizingMaskIntoConstraints = NO;
        _textView.delegate = self;
        _textView.scrollEnabled = NO;
        _textView.font = CELL_REG_FONT;
        _textView.textContainer.lineFragmentPadding = 0.0;
        _textView.textContainerInset = UIEdgeInsetsZero;
        [self.contentView addSubview:_textView];

        [self.contentView addConstraints: [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[view]-|" options:nil metrics:nil views:@{@"view": _textView}]];
        [self.contentView addConstraints: [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[view]-|" options:nil metrics:nil views:@{@"view": _textView}]];

        _heightConstraint = [NSLayoutConstraint constraintWithItem: _textView
                         attribute: NSLayoutAttributeHeight
                         relatedBy: NSLayoutRelationGreaterThanOrEqual
                         toItem: nil
                         attribute: NSLayoutAttributeNotAnAttribute
                         multiplier: 0.0
                         constant: (_textView.font.lineHeight + 15)];
        _heightConstraint.priority = UILayoutPriorityRequired - 1;
        [_textView addConstraint:_heightConstraint];
    }
    return self;
}

- (void)prepareForReuse {
    [super prepareForReuse];    
    self.minLines = 1;
}

- (void)setMinLines:(NSInteger)minLines {
    _heightConstraint.constant = minLines * _textView.font.lineHeight + 15;
}

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    if ([self.delegate respondsToSelector:@selector(textInputTableViewCellTextWillChange:)]) {
        [self.delegate textInputTableViewCellTextWillChange:self];
    }
    return YES;
}

- (void)textViewDidChange:(UITextView *)textView {
    if ([self.delegate respondsToSelector:@selector(textInputTableViewCellTextDidChange:)]) {
        [self.delegate textInputTableViewCellTextDidChange:self];
    }
}

接下来,我们用它在TableViewController

@interface SomeTableViewController () <TextInputTableViewCellDelegate>
@end

@implementation SomeTableViewController

. . . . . . . . . . . . . . . . . . . .

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

    TextInputTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: TextInputTableViewCellIdentifier forIndexPath:indexPath];
    cell.delegate = self;
    cell.minLines = 3;
    . . . . . . . . . .  
    return cell;
}

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

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

- (void)textInputTableViewCellWillChange:(TextInputTableViewCell *)cell {
    cell.lastRelativeFrameOriginY = cell.frame.origin.y - self.tableView.contentOffset.y;
}

- (void)textInputTableViewCellTextDidChange:(TextInputTableViewCell *)cell {
    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];

    [UIView performWithoutAnimation:^{
        [self.tableView moveRowAtIndexPath:indexPath toIndexPath:indexPath];
    }];

    CGFloat contentOffsetY = cell.frame.origin.y - cell.lastRelativeFrameOriginY;
    self.tableView.contentOffset = CGPointMake(self.tableView.contentOffset.x, contentOffsetY);

    CGRect caretRect = [cell.textView caretRectForPosition:cell.textView.selectedTextRange.start];
    caretRect = [self.tableView convertRect:caretRect fromView:cell.textView];

    CGRect visibleRect = self.tableView.bounds;
    visibleRect.origin.y += self.tableView.contentInset.top;
    visibleRect.size.height -= self.tableView.contentInset.top + self.tableView.contentInset.bottom;
    BOOL res = CGRectContainsRect(visibleRect, caretRect);
    if (!res) {
        caretRect.size.height += 5;
        [self.tableView scrollRectToVisible:caretRect animated:NO];
    }
}
@end
  • 这里minLines允许设置为TextView的最小高度(以抵抗高度由自动版式与UITableViewAutomaticDimension最小化)。

  • moveRowAtIndexPath:indexPath:用相同indexPath开始tableViewCell高度重新计算和重新布局。

  • performWithoutAnimation:将删除的副作用(的tableView内容偏移跳跃开始打字时新行)。

  • 重要的是要保持relativeFrameOriginY (不contentOffsetY因为小区更新过程!) contentSize当前单元格前的细胞可能是意想不到的方式通过的autoLayout微积分的变化。 打字时长的话它会删除系统上的视觉断字跳跃。

  • 请注意,你不应该设置该属性 estimatedRowHeight以下不工作

     self.tableView.estimatedRowHeight = UITableViewAutomaticDimension; 

    仅使用tableViewDelegate方法。

================================================== ========================

如果不介意反对的tableViewtableViewCell和从的tableView的tableViewCell更新几何形状之间的弱结合,就可以升级TextInputTableViewCell上面的类:

@interface TextInputTableViewCell : UITableViewCell
@property (nonatomic, weak) id<TextInputTableViewCellDelegate> delegate;
@property (nonatomic, weak) UITableView *tableView;
@property (nonatomic, readonly) UITextView *textView;
@property (nonatomic) NSInteger minLines;
@end


#import "TextInputTableViewCell.h"

@interface TextInputTableViewCell () <UITextViewDelegate> {
    NSLayoutConstraint *_heightConstraint;
    CGFloat _lastRelativeFrameOriginY;
}
@property (nonatomic) UITextView *textView;
@end

@implementation TextInputTableViewCell

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        self.selectionStyle = UITableViewCellSelectionStyleNone;

        _textView = [UITextView new];
        _textView.translatesAutoresizingMaskIntoConstraints = NO;
        _textView.delegate = self;
        _textView.scrollEnabled = NO;
        _textView.font = CELL_REG_FONT;
        _textView.textContainer.lineFragmentPadding = 0.0;
        _textView.textContainerInset = UIEdgeInsetsZero;
        [self.contentView addSubview:_textView];

        [self.contentView addConstraints: [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[view]-|" options:nil metrics:nil views:@{@"view": _textView}]];
        [self.contentView addConstraints: [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[view]-|" options:nil metrics:nil views:@{@"view": _textView}]];

        _heightConstraint = [NSLayoutConstraint constraintWithItem: _textView
                         attribute: NSLayoutAttributeHeight
                         relatedBy: NSLayoutRelationGreaterThanOrEqual
                         toItem: nil
                         attribute: NSLayoutAttributeNotAnAttribute
                         multiplier: 0.0
                         constant: (_textView.font.lineHeight + 15)];
        _heightConstraint.priority = UILayoutPriorityRequired - 1;
        [_textView addConstraint:_heightConstraint];
    }
    return self;
}

- (void)prepareForReuse {
    [super prepareForReuse];    
    self.minLines = 1;
    self.tableView = nil;
}

- (void)setMinLines:(NSInteger)minLines {
    _heightConstraint.constant = minLines * _textView.font.lineHeight + 15;
}

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {

    _lastRelativeFrameOriginY = self.frame.origin.y - self.tableView.contentOffset.y;
    return YES;
}

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

    NSIndexPath *indexPath = [self.tableView indexPathForCell:self];
    if (indexPath == nil) return;

    [UIView performWithoutAnimation:^{
        [self.tableView moveRowAtIndexPath:indexPath toIndexPath:indexPath];
    }];

    CGFloat contentOffsetY = self.frame.origin.y - _lastRelativeFrameOriginY;
    self.tableView.contentOffset = CGPointMake(self.tableView.contentOffset.x, contentOffsetY);

    CGRect caretRect = [self.textView caretRectForPosition:self.textView.selectedTextRange.start];
    caretRect = [self.tableView convertRect:caretRect fromView:self.textView];

    CGRect visibleRect = self.tableView.bounds;
    visibleRect.origin.y += self.tableView.contentInset.top;
    visibleRect.size.height -= self.tableView.contentInset.top + self.tableView.contentInset.bottom;

    BOOL res = CGRectContainsRect(visibleRect, caretRect);
    if (!res) {
        caretRect.size.height += 5;
        [self.tableView scrollRectToVisible:caretRect animated:NO];
    }
}
@end


Answer 8:

  1. 把你的UILabel背后的UITextView。
  2. 使用这样的回答: https://stackoverflow.com/a/36054679/6681462到的UILabel创建
  3. 给他们同样的限制和字体
  4. 他们设置相同的文字;

您单元的高度将通过UILabel的含量计算,但所有文字都会由TextField显示。



Answer 9:

UITextView *txtDescLandscape=[[UITextView alloc] initWithFrame:CGRectMake(2,20,310,2)];

    txtDescLandscape.editable =NO;
    txtDescLandscape.textAlignment =UITextAlignmentLeft;
    [txtDescLandscape setFont:[UIFont fontWithName:@"ArialMT" size:15]];
    txtDescLandscape.text =[objImage valueForKey:@"imgdescription"];
    txtDescLandscape.text =[txtDescLandscape.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    [txtDescLandscape sizeToFit];
    [headerView addSubview:txtDescLandscape];

    CGRect txtViewlandscpframe = txtDescLandscape.frame;
    txtViewlandscpframe.size.height = txtDescLandscape.contentSize.height;
    txtDescLandscape.frame = txtViewlandscpframe;

我觉得这种方式,你可以指望你的文本视图的高度,然后调整根据这样的高度你的tableview单元格,这样您就可以在小区全文



Answer 10:

斯威夫特版本

func textViewHeightForAttributedText(text: NSAttributedString, andWidth width: CGFloat) -> CGFloat {
    let calculationView = UITextView()
    calculationView.attributedText = text
    let size = calculationView.sizeThatFits(CGSize(width: width, height: CGFloat.max))
    return size.height
}


Answer 11:

如果你想自动调整UITableViewCell “基于内部的高度身高UITextView的高度。 看到这里我的答案: https://stackoverflow.com/a/45890087/1245231

解决的办法很简单,应该工作,因为iOS的7,确保Scrolling Enabled选项关闭UITextView里面UITableViewCell在故事板。

然后在您的UITableViewController的viewDidLoad()中设置的tableView.rowHeight = UITableViewAutomaticDimensiontableView.estimatedRowHeight > 0 ,例如:

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.rowHeight = UITableViewAutomaticDimension
    tableView.estimatedRowHeight = 44.0
}

而已。 UITableViewCell的高度将基于内自动地调整UITextView身高'。



Answer 12:

对于iOS 8.0及以上,你可以只使用

your_tablview.estimatedrowheight= minheight你想

your_tableview.rowheight=UItableviewautomaticDimension


文章来源: UITableViewCell with UITextView height in iOS 7?