8

我有一个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]方法我还定义了行高方法)。

4

5 回答 5

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;

希望这可以帮助。

于 2013-01-27T22:39:10.270 回答
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
于 2013-02-08T11:17:04.680 回答
1

UITextView的superview(或兄弟视图是您的 UITextView 的底部边缘固定到)是保持 UITextView 的高度不降低的原因。在不知道视图的视图层次结构的情况下,我建议调用setNeedsLayoutUITextView 的父视图。

于 2013-01-28T00:29:12.330 回答
1

在我过去的两个项目中,我也遇到了同样的问题。我做的是这个。

- (float)getHeightFortheDynamicLabel:(NSString *)stringForTheLabel
{
    CGSize maxSize = CGSizeMake(215, 2000.0);
    CGSize newSize = [stringForTheLabel sizeWithFont:[UIFont systemFontOfSize:14.0]
                                   constrainedToSize:maxSize];
    return newSize.height;
}

只需传递您需要确定其高度的字符串,此方法将返回您的大小。为您的标签设置此高度。

另请注意,使用行数设置为 0 的 UILabel 而不是 UITextView。此方法与 Label 完美搭配。一开始我也使用了导致偏移问题的 UITextView。后来有了标签,这很完美。尝试使用 UILabel。希望这对您有所帮助。还要仔细检查您用于标签的字体大小。使它们相同(对于方法内给出的标签和值)。

于 2013-02-04T07:08:20.053 回答
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 个像素?

于 2013-02-02T02:24:27.330 回答