如何在 iOS 7 中计算带有 UITextView 的 UITableViewCell 的高度?
我在类似问题上找到了很多答案,但sizeWithFont:
参与了每个解决方案,并且不推荐使用此方法!
我知道我必须使用- (CGFloat)tableView:heightForRowAtIndexPath:
,但是如何计算 TextView 显示整个文本所需的高度?
如何在 iOS 7 中计算带有 UITextView 的 UITableViewCell 的高度?
我在类似问题上找到了很多答案,但sizeWithFont:
参与了每个解决方案,并且不推荐使用此方法!
我知道我必须使用- (CGFloat)tableView:heightForRowAtIndexPath:
,但是如何计算 TextView 显示整个文本所需的高度?
首先,需要注意的是,UITextView 和 UILabel 在文本呈现方式上存在很大差异。UITextView 不仅在所有边框上都有 insets,而且它里面的文本布局也略有不同。
因此,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;
}
此函数将 aNSAttributedString
和所需的宽度作为 aCGFloat
并返回所需的高度
由于我最近做了类似的事情,我想我也会分享一些我遇到的相关问题的解决方案。我希望它会帮助某人。
这更深入,将涵盖以下内容:
UITableViewCell
根据显示包含的全部内容所需的大小设置高度UITextView
UITextView
时调整大小时保持第一响应者UITableViewCell
如果您正在使用静态表格视图或者您只有已知数量的UITextView
s,您可以使步骤 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
)作为实例变量添加到您的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;
}
对于接下来的两个函数,重要的是,将 的委托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
}
- (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];
}
}
编辑时,您的某些部分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 的直接引用。如果您有bodyTextView
找不到的问题,请检查该功能的更新版本。
有一个新的函数来代替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 添加到项目中的 prefix.pch 文件中,如下所示:
#define IOS_NEWER_OR_EQUAL_TO_7 ( [ [ [ UIDevice currentDevice ] systemVersion ] floatValue ] >= 7.0 )
如果您使用的是 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];
}
但请记住:文本视图必须是可滚动的,并且您必须设置约束以使其适用于自动尺寸:
最基本的单元格示例是:
Tim Bodeit 的回答很棒。我使用简单解决方案的代码来正确获取文本视图的高度,并在heightForRowAtIndexPath
. 但我不使用其余答案来调整文本视图的大小。frame
相反,我编写代码来更改cellForRowAtIndexPath
.
frame
在 iOS 6 及更低版本中一切正常,但在 iOS 7 中,即使确实调整了文本视图的大小,文本视图中的文本也无法完全显示。(我没有使用Auto Layout
)。这应该是在 iOS 7 中有TextKit
并且文本的位置由NSTextContainer
in控制的原因UITextView
。所以在我的情况下,我需要添加一行来设置someTextView
它以使其在 iOS 7 中正常工作。
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
someTextView.textContainer.heightTracksTextView = YES;
}
正如文档所说,该属性的作用是:
控制接收器是否在调整其文本视图大小时调整其边界矩形的高度。默认值:否。
如果保留默认值,则在调整大小后frame
,someTextView
大小textContainer
不会改变,导致文本只能显示在调整大小之前的区域中。
并且可能需要设置scrollEnabled = NO
以防万一有多个textContainer
,以便文本从一个回流textContainer
到另一个。
这是另一种旨在简化和快速原型设计的解决方案:
设置:
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 单元大小的完整示例,这里:
完整的平滑解决方案如下。
首先,我们需要带有 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 的 AutoLayout 来抵抗高度最小化)。
moveRowAtIndexPath:indexPath:
使用相同的 indexPath 开始 tableViewCell 高度重新计算和重新布局。
performWithoutAnimation:
消除副作用(tableView 内容偏移在键入时开始新行跳跃)。
relativeFrameOriginY
在单元格更新期间保留(不是
contentOffsetY
!)很重要,因为contentSize
在当前单元格之前的单元格可能会被 autoLayout 演算以意想不到的方式更改。它消除了在输入长词时系统断字的视觉跳跃。
请注意,您不应该设置属性 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 的内容计算,但所有文本将由 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;
我认为这样您可以计算文本视图的高度,然后根据该高度调整表格视图单元格的大小,以便您可以在单元格上显示全文
斯威夫特版本
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
}
如果要UITableViewCell
根据内部高度的高度自动调整UITextView
高度。在这里查看我的答案:https ://stackoverflow.com/a/45890087/1245231
该解决方案非常简单,并且应该从 iOS 7 开始工作。确保关闭StoryBoard 中的内部Scrolling Enabled
选项。UITextView
UITableViewCell
然后在您的 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