2

3つのラベル、ボタン、およびUITextViewを含むカスタムテーブルセルがあります。

UITextViewのテキストは、サーバーから取得しているデータであるため、実行時にのみ認識されます。

UITextViewに入力したテキストに基づいて、UITextViewとカスタムテーブルセルの両方のサイズを正しい高さにしようとしています。

UITextViewのテキストは、-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPathメソッドで設定されます。

ここでは、以下を使用してUITextView(bodyTextView)のサイズを設定しようとしています。

CGSize stringSize = [cell.bodyTextView.text sizeWithFont:cell.bodyTextView.font constrainedToSize:CGSizeMake(cell.bodyTextView.bounds.size.width, 9999) lineBreakMode:NSLineBreakByWordWrapping];

[cell.bodyTextView setText:threadMessage.body];

CGRect bodyFrame = cell.bodyTextView.frame;

bodyFrame.size = cell.bodyTextView.contentSize;

[cell.bodyTextView setFrame:bodyFrame];

UITextViewの下部に「TopSpaceTo」制約があるにもかかわらず、UIButtonが本来の位置に移動していないか、多かれ少なかれ正常に機能しているようです。自動的に動くと思っていたでしょう。ただし、これをプログラムで適切な場所に移動できるので、大したことではありません。

コードの次のビットは、ラベルとUITextViewに収まるようにtableViewCellのサイズを適切な高さにしますが、下部のボタンに十分なスペースがありません。次に、セルの高さを計算し、次を使用して返します...

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath: (NSIndexPath *)indexPath
{
    CGSize stringSize = [threadMessage.body sizeWithFont:[UIFont systemFontOfSize:14] constrainedToSize:CGSizeMake(280, 9999) lineBreakMode:NSLineBreakByWordWrapping];

    float oldHeight = 28;
    float newHeight = stringSize.height;

    return tableView.rowHeight - oldHeight + newHeight;
}

ご覧のとおり、UITextViewの高さと新しい高さの高さを変えています。プログラムでoldHeightを取得しようとしましたが、何千ものクレイジーな値を取得していました。

大きな問題は、ビューが最初に表示されたときに、行のサイズが多かれ少なかれ正しく設定されていることです。ただし、UITextViewのサイズは変更されていません。スクロールして画面外に移動してからスクロールして戻すと、UITextViewのサイズが適切に設定されます。しかし、もう一度スクロールして画面に戻ると、サイズが再び1行に変更されます。

鶏が先か卵が先か、頭が回らない気がします。

私が理解したいと思っている2つの主な問題は次のとおりです。

1)UITextViewを最初から適切なサイズに設定し、画面のスクロールオフや画面上でスクロールしてもその状態を維持するにはどうすればよいですか?

2)カスタムTableCellViewを適切なサイズにして、ボタンの高さを含めるにはどうすればよいですか?

これがすべて理にかなっていることを願っています。十分な詳細を提供しました。質問があれば教えてください。

任意の提案をいただければ幸いです。ありがとうございました!

よろしく、

ピーター

4

3 に答える 3

1

わかりました、私はついに問題を理解しました。今日、これが私の脳を何時間もひねったので、他の誰かがこれに遭遇した場合に備えて、私の解決策を投稿すると思いました。

この問題は、iOS 6 SDK を使用している私のプロジェクトに関係があるのではないかと考えました。iOS 5 シミュレーターをダウンロードし、その上でアプリを実行してみました。起動直後にエラーになりました。NSLayoutInconsitencyException (またはそれに類似したもの)。いくつかのオンライン検索で掘り下げた後、iOS 5 は iOS 6 の設定と互換性がないことがわかりました。

この設定は「User Autolayout」で、ストーリーボード ファイルでチェックされていました。それを見つけるには、ストーリーボード ファイルを選択し、右側の [ファイル インスペクター] を選択します (Command-Option-1)。[Interface Builder Document] セクションの下に、[Use Autolayout] のチェックボックスが表示されます。これをオフにすると、物事がよりうまく機能し始めました。画面上でセルをスクロールするたびに、UITextView が 1 行にサイズ変更されて、完全な長さに戻ることはなくなりました。

ただし、セルが適切な高さではないという問題がまだありました。Autolayout の問題を解決したので、これは非常に単純であることがわかりました (どこにでもあるコメントアウトされた試行錯誤のテスト コードを信じられないでしょう :))。

cellforRowAtIndexPath 関数では、UITextView のテキストを好きなように設定してから、単純に contentSize を取得し、UITextView のフレームのサイズを変更する必要があります...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    MyCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCellIdentifier"];

    [cell.bodyTextView setText:myText];

    CGRect bodyFrame = cell.bodyTextView.frame;
    bodyFrame.size = cell.bodyTextView.contentSize;
    [cell.bodyTextView setFrame:bodyFrame];

    ... Whatever else you need to do here ...
}

次に、heightForRowAtIndexPath で、セルを再度取得してテキストを設定すると、適切なサイズの違いを取得できるため、適切なサイズが返されることがわかりました。サイズの違いを使用することで、表のセルにある可能性のある他の UI 要素を使用できます。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    MyCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCellIdentifier"]; 

    float oldHeight = cell.bodyTextView.frame.size.height;

    cell.bodyTextView.text = threadMessage.body;

    CGRect bodyFrame = cell.bodyTextView.frame;
    bodyFrame.size = cell.bodyTextView.contentSize;

    float newHeight = cell.bodyTextView.contentSize.height;

    return tableView.rowHeight - oldHeight + newHeight;
}

これが将来誰かに役立つことを願っています。これが意味をなさない場合は、遠慮なく質問してください。私を助けようとしてくれた Mohit に感謝します。とても有難い。

于 2012-11-23T10:18:59.937 に答える
0

回転時にカスタムセルの自動サイズ変更中にも、この同じ問題に直面しました。戦いの後、ビューをサブビューとしてcell.contentviewに追加しているため、cell.contentViewを承認するという解決策を得ました。

私は次のコードを使用し、私のコードは正常に動作します:)

cell.contentView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin;
于 2013-07-02T05:56:10.783 に答える
0

Etep、これを試してみてください...まず、セルとボタンのサイズ変更/方向プロパティをオフにし、その後、到着したテキストに従ってテキストビューの適切な寸法を作成できるため、行の高さ、テキストサイズの取得を使用する代わりに、テキストビューの適切な高さを取得するために必要なもの...そして残りは問題ありません.(「cellForRowAtIndexPath」では、再利用可能なセルを使用するか、コードを配置するif (cell==nil){} 内)

于 2012-11-23T07:20:00.883 に答える