UITableViewCell与iOS 7中的UITextView高度?
我如何计算在UITableViewCell UITextView在iOS 7中的高度?
我在类似的问题上find了很多答案,但是sizeWithFont:
参与了每个解决scheme,并且这个方法已经被弃用了!
我知道我必须使用- (CGFloat)tableView:heightForRowAtIndexPath:
但我如何计算我的TextView需要显示整个文本的高度?
首先,需要注意的是,在文本呈现方式上,UITextView和UILabel有很大的区别。 UITextView不仅在所有的边界上都有插入,而且它里面的文本布局稍有不同。
因此, sizeWithFont:
是一个不错的方式去UITextViews。
相反, UITextView
本身有一个名为sizeThatFits:
的函数sizeThatFits:
它将返回显示边界框内所有UITextView
内容所需的最小尺寸,您可以指定。
以下对于iOS 7和更老版本同样适用,并且现在不包括任何不赞成使用的方法。
简单的scheme
- (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
并返回所需的高度
详细解决scheme
因为我最近做了类似的事情,所以我想我也会分享一些解决scheme来解决我遇到的问题。 我希望它能帮助别人。
这是更深入,将涵盖以下内容:
- 当然:根据显示所包含的
UITextView
的全部内容所需的大小来设置UITableViewCell
的高度 - 响应文本更改(并对行的高度变化进行animation处理)
- 将光标保持在可见区域内,并在编辑时调整
UITableViewCell
大小以保持第一响应者在UITextView
如果您正在使用静态表视图,或者只有已知数量的UITextView
,则可以使步骤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
)作为实例variables添加到您的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.编辑时启用resize
对于接下来的两个函数,重要的是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 (eg through autolayout // constraints), resize it here [self scrollToCursorForTextView:textView]; // OPTIONAL: Follow cursor }
4.在编辑时按住光标
- (void)textViewDidBeginEditing:(UITextView *)textView { [self scrollToCursorForTextView:textView]; }
这将使UITableView
滚动到游标的位置,如果它不在UITableView的可见Rect中:
- (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.通过设置insets来调整可见矩形
在编辑时,键盘可以覆盖UITableView
某些部分。 如果tableviews insets没有被调整, 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]; }
请不要生我的气,让这个答案这么久。 虽然并非所有问题都需要回答,但我相信这些直接相关的问题会有其他人帮助。
更新:
正如Dave 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的直接引用。 如果您没有findbodyTextView
的问题,请检查function的更新版本。
有一个新的函数来replacesizeWithFont,它是boundingRectWithSize。
我在我的项目中添加了以下function,它使用iOS7上的新function和iOS上的旧function,它们的大小与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 } }
您可以在项目中的prefix.pch文件中添加IOS_NEWER_OR_EQUAL_TO_7,如下所示:
#define IOS_NEWER_OR_EQUAL_TO_7 ( [ [ [ UIDevice currentDevice ] systemVersion ] floatValue ] >= 7.0 )
如果你使用UITableViewAutomaticDimension,我有一个非常简单的(仅限iOS 8)解决scheme。 在我的情况下,这是一个静态表视图,但我想你可以适应这个dynamic原型…
我有一个约束出口的文本视图的高度,我已经实现了这样的以下方法:
// 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文本视图各边的边距和文本视图的预定义高度约束。
蒂姆Bodeit的答案是伟大的。 我使用简单解决scheme的代码来正确获取文本视图的高度,并在heightForRowAtIndexPath
使用该高度。 但是我不使用剩下的答案来调整文本视图的大小。 相反,我编写代码来更改cellForRowAtIndexPath
的文本视图frame
。
一切工作在iOS 6及以下版本,但在iOS 7中,文本视图中的文本不能完全显示,即使文本视图的frame
确实resize。 (我没有使用Auto Layout
)。 这应该是在iOS 7中有TextKit
的原因,并且文本的位置由UITextView
的NSTextContainer
控制。 所以在我的情况下,我需要添加一行来设置someTextView
,以使其在iOS 7中正常工作。
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) { someTextView.textContainer.heightTracksTextView = YES; }
正如文件所述,这个属性的作用是:
控制接收器在调整文本视图的大小时是否调整边界矩形的高度。 默认值:NO。
如果将其保留为默认值,则调整someTextView
的frame
大小后, textContainer
的大小不会更改,导致文本只能在resize之前显示在区域中。
也许需要设置scrollEnabled = NO
,如果有多个textContainer
,那么文本将从一个textContainer
另一个。
这是一个旨在简化和快速原型devise的解决scheme:
build立:
- 表格与原型单元格。
- 每个单元格包含dynamic大小的
UITextView
w /其他内容。 - 原型单元格与
TableCell.h
关联。 -
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。
如果您使用自动布局,一种方法是让自动布局引擎为您计算大小。 这不是最有效的方法,但是相当方便(可以说是最准确的)。 随着单元格布局的复杂性增长,这变得更加方便 – 例如,突然间,单元格中有两个或更多个文本视图/字段。
我用一个完整的示例来回答一个类似的问题,使用自动布局调整tableview单元格大小,在这里:
如何调整superview以适应所有子视图与自动布局?
完整的stream畅解决scheme如下。
首先,我们需要带有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
允许设置minLines
最小高度(以抵制与UITableViewAutomaticDimension通过AutoLayout高度最小化)。 -
moveRowAtIndexPath:indexPath:
用同样的indexPath启动tableViewCell高度重新计算和重新布局。 -
performWithoutAnimation:
删除副作用(tableView内容偏移量,在input时开始换行)。 -
在单元更新期间保留
relativeFrameOriginY
(不是contentOffsetY
!)非常重要,因为当前单元格之前的单元格的contentSize
可能会以意外的方式被autoLayout演算改变。 它可以在input长单词的同时消除系统连字符的视觉跳转。 -
请注意,你不应该设置
estimatedRowHeight
! 以下不起作用self.tableView.estimatedRowHeight = UITableViewAutomaticDimension;
只使用tableViewDelegate方法。
================================================== ========================
如果不介意tableView和tableViewCell之间的弱绑定和更新tableViewCell中 tableView的几何,那么可以升级上面的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
- 把UILabel放在你的UITextView后面。
- 使用这个答案: https ://stackoverflow.com/a/36054679/6681462你创build的UILabel
- 给他们相同的约束和字体
- 设置相同的文本;
你的单元格的高度将由UILabel的内容计算,但所有的文本都将由TextField显示。
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单元格的大小,以便你可以在单元格上显示全文
Swift版本
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 }
如果您想根据内部UITextView
的高度自动调整UITableViewCell
的高度。 看到我的答案在这里: https : //stackoverflow.com/a/45890087/1245231
该解决scheme非常简单,应该从iOS 7开始工作。确保StoryBoard中的UITableViewCell
中的UITextView
的Scrolling Enabled
选项已closures 。
然后在你的UITableViewController的viewDidLoad()中设置tableView.rowHeight = UITableViewAutomaticDimension
和tableView.estimatedRowHeight > 0
如:
override func viewDidLoad() { super.viewDidLoad() tableView.rowHeight = UITableViewAutomaticDimension tableView.estimatedRowHeight = 44.0 }
而已。 UITableViewCell
的高度将根据内部UITextView
的高度自动调整。
对于iOS 8及以上版本,您可以使用
your_tablview.estimatedrowheight= minheight
你想要的
your_tableview.rowheight=UItableviewautomaticDimension