如何在 iOS 7 中计算带有 UI 文本视图的 UI 表查看器的高度?
我找到了很多类似问题的答案,但是< code>sizeWithFont:参与了每一个解决方案,这个方法已经被否决了!
我知道我必须使用-(CGFloat)tableView: heightForRowAtIndexPath:
但是如何计算我的TextView显示整个文本所需的高度呢?
如果你正在使用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];
}
但请记住:文本视图必须是可滚动的,并且必须设置约束,使其适用于自动标注:
最基本的细胞例子是:
有一个新函数可以替换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 )
首先,非常重要的是要注意,在文本的呈现方式方面,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 表查看器
的高度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有水平和垂直约束。我还禁用了文本视图的滚动。 我还尝试手动更改单元格的高度约束,但单元格也不会