6

プロパティとしていくつかの UILabels、UIButton、および NSBlock を含むカスタム (サブクラス化) UITableViewCell があります。このサブクラスは と呼ばれExploreCellます。2 つのプロパティは UILabels でwaitLabellastUpdateLabelそれぞれ と という名前が付けられています。

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

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のフレームが実際に変更されることを意味します。

なぜこれが発生するのか、どのように修正できるのか教えてください。

4

3 に答える 3

12

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

于 2013-03-20T22:02:01.647 に答える
0

走ってみましたか

[CATransaction flush];
[CATransaction begin];

これらの値を更新した後、メインスレッドで?

于 2013-03-20T21:36:18.690 に答える
-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] が常に一緒になるようにしてください。

于 2013-03-20T21:51:02.840 に答える