我有一个UITextView
我需要调整大小以使其宽度可以拉伸以填充屏幕,但可变高度,以便它足够大以显示所有文本。调整大小时,应使UITextView
达到最小可能的高度,以使其适合。
为了做到这一点,我一直在使用以下代码:
textView.text = textMessage;
[textView sizeToFit];
CGRect rect = textView.frame;
rect.size.height = textView.contentSize.height;
textView.frame = rect;
当我这样做时,似乎并没有使UITextView成为可能的最小高度。看来下方还有一些空间。这是一个例子(我已经将背景颜色设置为红色以说明我的观点):
请有人可以告知为什么会这样,以及我如何解决这个问题?请注意,UITextView位于自定义UITableView单元格中。此单元格使用自动调整蒙版水平拉伸以根据方向填充屏幕。
我花了很多时间试图让它工作但我不明白为什么底部有多余的空间,当我旋转设备时,UITextViews的高度似乎都保持不变(即使我打电话[UITableView reloadData]
方法我也定义了行加权方法。
答案 0 :(得分:9)
我曾经遇到过同样的问题而且发现了这个问题。
CGSize maximumLabelSize = CGSizeMake(300,80);//Or whatever size you need to be the max
CGSize expectedLabelSize = [textMessage sizeWithFont:[UIFont boldSystemFontOfSize:18] constrainedToSize:maximumLabelSize lineBreakMode:UILineBreakModeWordWrap];
rect.size.height = expectedLabelSize.height;
textView.frame = rect;
希望这有帮助。
答案 1 :(得分:2)
以下是您问题的解决方案。
//
// CustomCell.m
// Custom
//
// Created by Syed Arsalan Pervez on 2/8/13.
// Copyright (c) 2013 SAPLogix. All rights reserved.
//
#import "CustomCell.h"
@implementation CustomCell
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
// Initialization code
_textView = [[UITextView alloc] initWithFrame:CGRectZero];
[_textView setBackgroundColor:[UIColor clearColor]];
[_textView setContentInset:UIEdgeInsetsMake(0, 0, 0, 0)];
[[self contentView] addSubview:_textView];
}
return self;
}
- (void)layoutSubviews
{
[super layoutSubviews];
[_textView setFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}
- (void)dealloc
{
[_textView release];
[super dealloc];
}
@end
使用单元格。
//
// TestViewController.m
// Custom
//
// Created by Syed Arsalan Pervez on 2/8/13.
// Copyright (c) 2013 SAPLogix. All rights reserved.
//
#import "TestViewController.h"
#import "CustomCell.h"
@interface TestViewController ()
@end
@implementation TestViewController
- (void)viewDidLoad
{
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 2;
}
#define DEFAULT_TEXT @"This is an example block of text which seems to run over the edge of the UITableView so it no longer shows up the way I want."
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *_identifier = @"CustomCell";
CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:_identifier];
if (!cell)
{
cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:_identifier];
[[cell contentView] setBackgroundColor:[UIColor redColor]];
}
cell.textView.text = DEFAULT_TEXT;
return cell;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
CGRect frame = [[UIApplication sharedApplication] statusBarFrame];
UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
// You can replace DEFAULT_TEXT with text you want to be displayed in the cell.
CGSize size = [DEFAULT_TEXT sizeWithFont:[UIFont systemFontOfSize:13] constrainedToSize:CGSizeMake( UIInterfaceOrientationIsPortrait(orientation) ? frame.size.width : frame.size.height, 9999)];
return size.height;
}
- (UIInterfaceOrientation)interfaceOrientation
{
return (UIInterfaceOrientation)UIInterfaceOrientationMaskAll;
}
- (void)dealloc
{
[super dealloc];
}
@end
答案 2 :(得分:1)
UITextView的superview
(或同级视图是UITextView固定的底边)是保持UITextView高度不变的原因。在不知道视图的视图层次结构的情况下,我建议在UITextView的父视图上调用setNeedsLayout
。
答案 3 :(得分:1)
我过去的两个项目也遇到了同样的问题。我做的是这个。
- (float)getHeightFortheDynamicLabel:(NSString *)stringForTheLabel
{
CGSize maxSize = CGSizeMake(215, 2000.0);
CGSize newSize = [stringForTheLabel sizeWithFont:[UIFont systemFontOfSize:14.0]
constrainedToSize:maxSize];
return newSize.height;
}
只需传递您需要确定其高度的字符串,此方法将返回您的大小。为标签设置此高度。
另请注意,使用UILabel而不是UITextView,行数设置为0.此方法适用于Label。在开始时我也使用UITextView导致了偏移问题。后来有了标签,这很完美。尝试使用UILabel。希望这对你有所帮助。并仔细检查您用于标签的字体大小。使它们相同(对于方法中给出的标签和值)。
答案 4 :(得分:0)
我同意mpwhitt,但会增加一点点差异,以实现表格单元格的拉伸性质。
CGSize expectedLabelSize = [textView.text sizeWithFont:textView.font
constrainedToSize:CGSizeMake(textView.frame.size.width,9999)
lineBreakMode:UILineBreakModeWordWrap];
rect.size.height = expectedLabelSize.height;
textView.frame = rect;
这样您就不必担心字体是否发生变化或标签宽度是否发生变化。我不确定这是否会消除那些超出高度的小条带,但我从来没有像你要求的那样完全按照这种方式工作。
是否可以从你找到的高度中减去3-5个像素?