UITextView UITableViewCell sizeToFit无法按预期工作

时间:2013-01-27 11:23:14

标签: iphone ios objective-c ipad uitextview

我有一个UITextView我需要调整大小以使其宽度可以拉伸以填充屏幕,但可变高度,以便它足够大以显示所有文本。调整大小时,应使UITextView达到最小可能的高度,以使其适合。

为了做到这一点,我一直在使用以下代码:

textView.text            = textMessage;
[textView sizeToFit];
CGRect rect              = textView.frame;
rect.size.height         = textView.contentSize.height;
textView.frame           = rect;

当我这样做时,似乎并没有使UITextView成为可能的最小高度。看来下方还有一些空间。这是一个例子(我已经将背景颜色设置为红色以说明我的观点):

enter image description here

请有人可以告知为什么会这样,以及我如何解决这个问题?请注意,UITextView位于自定义UITableView单元格中。此单元格使用自动调整蒙版水平拉伸以根据方向填充屏幕。

我花了很多时间试图让它工作但我不明白为什么底部有多余的空间,当我旋转设备时,UITextViews的高度似乎都保持不变(即使我打电话[UITableView reloadData]方法我也定义了行加权方法。

5 个答案:

答案 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个像素?