2013-03-20 14 views
6

カスタム(サブクラス化された)UITableViewCellには、いくつかのUILabels、UIButton、およびNSBlockがプロパティとして含まれています。このサブクラスはExploreCellと呼ばれます。 2つのプロパティはUILabelsで、それぞれwaitLabellastUpdateLabelという名前です。UITableViewCellサブビューのフレームを更新しても効果がありません

lastUpdateLabelの内容がnilであるか空白、つまり@""である場合、waitLabelを垂直方向(Y軸上)に10ピクセル移動する必要があります。私はこれを、-tableView:cellForRowAtIndexPath:メソッドに入れた次のコードに示すように、NSDictionaryのオブジェクトをチェックしています。

CGRect frame = cell.waitLabel.frame; 

if ([[venue allKeys] containsObject:@"wait_times"] && ([[venue objectForKey:@"wait_times"] count] > 0)) { 

    frame.origin.y = 43; 

} 

else { 
    frame.origin.y = 53; 
} 

[cell.waitLabel setFrame:frame]; 

しかし、このコードは断続的に動作し、まだ動作しません、-setNeedsLayoutを呼び出そうとしましたました。断続的に言えば、数回スクロールすると、セルの原点を10ピクセル下に移動する基準に一致するセルの1つまたは2つが実際にwaitLabelのフレームを変更したことになります。

なぜこのようなことが起こっているのか、どのように修正できるのか教えてください。

+0

あなたはそのコードをどこに入れましたか? – Uby

+0

-cellForRow .... –

+0

自動レイアウトを使用していますか? – rdelmar

答えて

12

これは自動レイアウトの問題のようです。あなたが明示的にそれをオフにしていなければ、それはオンです。セルの上端(または下端)にコンストレイントを作成し、フレームを設定するのではなく、その制約の定数をコード内で変更する必要があります。 WWDC 2012のビデオによると、自動レイアウトを使用している場合は、コードにsetFrame:メッセージを含めないでください。

0

は、あなたがそれらの値を更新した後、メインスレッド上

[CATransaction flush]; 
[CATransaction begin]; 

を実行しようとしたことがありますか?

+0

これはうまくいかず、私はこの問題を回避するためのハッキーな試みを使用したくありません。 –

+0

ああ、私はちょうどあなたがこれを行うのを見た。なぜそこではうまくいかないのか分かりません。速読は間違ったスレッドでアクションを実行することであると考えました。 –

-3

いずれかのセルでレイアウトを変更して直ちに表示したい場合は、[tableView beginUpdates] + [tableView endUpdates]を使用する必要があります。

-(void)someMethod 
{ 
    [tableView beginUpdates]; 
    // your code: 
    CGRect frame = cell.waitLabel.frame; 

    if ([[venue allKeys] containsObject:@"wait_times"] && ([[venue objectForKey:@"wait_times"] count] > 0)) 
    { 

     frame.origin.y = 43; 

    } 
    else { 
     frame.origin.y = 53; 
    } 
    [cell.waitLabel setFrame:frame]; 

    [tableView endUpdates]; 
} 

[tableView beginUpdates]と[tableView endUpdates]が必ず一緒になっていることを確認してください。

+0

これは、-beginUpdatesメソッドと-endUpdatesメソッドの誤った使い方です。特に、行の一括挿入、更新、および削除を管理するためのものです。 –

+0

@max_私は自分のセルに同じ機能を持っていました。そこには3つのラベルがあり、そのうちの2つはいくつかのブール値に応じてシフトして色あせました。私はbeginUpdatesとendUpdatesを自分のコードに追加しました。おそらくそれはあなたがカスタムUITableViewCellを持っているからです。 – AzaFromKaza

+0

_maxは正しいです - 悪い習慣 – AlexeyVMP

関連する問題