2013-10-16 6 views
5

私はiPhoneのアプリケーションを使用しています。私はUITableViewを使用して、1行に1つのテキスト応答をフォーマットしています。私はストーリーボード内にセルを設定して、その中にラベルを入れ、ラベルがセルの端から10ポイントでなければならないという制約を設定しました。 UITableViewCellのカスタムサブクラスを設定し、ストーリーボードのセルをそのクラスに設定して、コンセントを接続しました。UITableViewCellコンテンツの移動

しかし、テーブルを読み込むと、セルを選択したとき、または追加のセルをテーブルに読み込むときに、セル内のテキストが若干右に移動することがあります。実際、後者の場合、時にはすべてが右にシフトします。既にそこにあったセルさえも!

ここで何が起こっているのですか? tableView:cellForRowAtIndexPath:で行っている唯一の変更は、ラベルのテキストです。私はいつもそれを設定しています。そして、私はストーリーボードのセルで「インデントを編集中」の設定を解除しました。

いくつかの質問に答える:私はストーリーボードを使用してビューを設定しています。 Xcodeは制約のあいまいさを報告していません。また、ここでのスクリーンショットは、前と後に、次のとおりです。

enter image description here enter image description here

+2

あなたはnsconstraintを設定している部分(プログラムでもストーリーボードでも設定していますか?) – abbood

+0

移動前と移動後のセルのスクリーンショットを置くことができますか? – abbood

+0

問題のあるビューを分離してコントローラを表示し、それを新しいプロジェクトに配置し、そのソースを共有することは可能でしょうか? –

答えて

1

私の推測では、ラベルの制約があいまいであるということです。あいまいさは、不可解な理由のためにUIコンポーネントを飛び回らせる可能性があります。おそらく、ラベルが両方の軸上の位置を定義するために、より多くの制約を設定する必要があります。

または、IBの[エディタ]メニューの[コンテンツに適合するサイズ(固有のコンテンツサイズ)]にラベルを設定するだけで済みます。

+0

Xcodeはあいまいな制約を報告していませんし、制約に関連するログメッセージを受け取っていないので、そうでないかもしれません。ラベルを本質的なコンテンツサイズに設定することは、テーブルの各行がラベル内に異なるテキストを持つため意味をなさないように見えます。 – dpassage

+0

Xcodeはあいまいな制約を自動的に報告しません。ビューでhasAmbiguousLayoutを呼び出す必要があります。 – bilobatum

+0

ラベルが固有のコンテンツサイズに設定されている場合、ラベルはコンテンツのサイズ(テキスト)に従って自動的にサイズが調整されます。 – bilobatum

-1

UITableViewCellのカスタムサブクラスをお持ちの場合は、layoutSubviewsを実装してみてください。私は私の頭の上から試してみましょう:今すぐ

static CGFloat const kLeftMargin = 10.0f; 

- (void) layoutSubviews 
{ 
    [super layoutSubviews]; 

    /* Prepare for processing */ 
    CGSize cellSize = self.bounds.size; 

    /* Change the textLabel frame */ 
    { 
    /* Compute the new label frame */ 
    CGSize labelSize = self.textLabel.bounds.size; 
    CGFloat xCoor = kLeftMargin; 
    CGFloat yCoor = roundf((cellSize.height - labelSize.height)/2.0f); 
    CGRect labelFrame = CGRectMake(xCoor, yCoor, 
            labelSize.width, labelSize.height); 

    /* Set the new label frame */ 
    self.textLabel.frame = labelFrame; 
    } 
} 

、これは通常推奨されているものではなく、必要に応じた経験から、いくつかの正確なレイアウト機能が行われ(多くの人々は、ストーリーボードとニブを使用するので) 、layoutSubviewsを実装します。

+0

誰かがdownvotingの前にこれを試したことがありますか? –

1

新しいラベルをUITableViewCellに追加しましたか?それとも既に存在するtextLabelで作業していますか?新しいセルを追加した場合は、そのセルを削除し、代わりにセルの既存のtextLabelプロパティを使用することを検討してください。それが何らかの理由でオプションでない場合は、追加したラベルがセルのcontentViewにあることを再確認し、すべての制約はセル自体ではなく親ビューに対して相対的であることを再確認します。

また、デバッグのために、セルのcontentView背景色を赤に設定することもできます(cell.contentView.backgroundColor = [UIColor redColor];)。これは、移動する内容やラベル、全体のビュー。

1

これはコードを見ずに推測したものです。私は、アプリが既存のセルを再利用したときに同様の問題が発生したが、ラベルの寸法が正しくなかった。したがって、新しいラベルを追加する前に、cellForRowAtIndexPathメソッドで古いラベルを削除する必要がありました。ここで私は古いものを削除方法は次のとおりです。

UIView *oldLabel = [cell viewWithTag:3]; 
if (oldLabel != nil) 
{ 
    [oldLabel removeFromSuperview]; 
} 

それから私は、このような新しいラベルを追加しました:

[cell.contentView addSubview:newLabelOrWhatever]; 
1

価値があなたの文字列の内容は、スペースが上の接頭辞がないことを確認するためにチェックされることがありますそれ。また、背景色を設定することで、ラベルの実際の位置を確認することもできます。

0

セルが選択されたときにラベルが移動すると、同様の問題が発生しました。私はカスタムNibからロードしていたカスタムセルでした。

Nibでは、どのビューにもUITableViewCell(スーパークラス)のbackgroundViewを設定していませんでした。 ContentViewにセットしたら、問題は止まった。

私の自動レイアウト制約はうまく見えて問題はなかったので、それを修正したのは上記のものと仮定しています。

関連する問題