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

私も過去の 2 つのプロジェクトで同じ問題を抱えていました。私がしたことはこれでした。

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

高さを決定する必要がある文字列を渡すだけで、このメソッドはサイズを返します。この高さをラベルに設定します。

また、UITextView の代わりに、行数を 0 に設定した UILabel を使用することにも注意してください。この方法は、Label で完璧に機能します。最初は、オフセットの問題を引き起こした UITextView も使用していました。後でラベルを付けると、これは完璧に機能しました。UILabel で試してください。これがお役に立てば幸いです。また、ラベルに使用したフォントのサイズも再確認してください。それらを同じにします(メソッド内で指定されたラベルと値の場合)。

于 2013-02-04T07:08:20.053 に答える
1

UITextView (または兄弟ビューは、UITextViewのsuperview下端に固定されています) は、UITextView の高さが減少しないようにするものです。ビューのビュー階層を知らなくてもsetNeedsLayout、UITextView の親ビューを呼び出すことをお勧めします。

于 2013-01-28T00:29:12.330 に答える
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 に答える