0

私のカスタムテーブルビューセルサブクラスでは、テキストラベルの1つの場所は、ivar(NSString)のコンテンツによって異なります。(つまり、NSStringが空の文字列の場合、テキストラベルのフレームの位置は異なります)。

次のように更新された場合の位置:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    customOverlayCell *myCell = [self.tableView dequeueReusableCellWithIdentifier:@"CustomOverlayCell"];

    if ([buildingFName isEqual:@""])
    {
        CGRect titleLabelFrame = myCell.titleLabel.frame; 
        titleLabelFrame.origin.y  = 45;
        [myCell.titleLabel setFrame:titleLabelFrame];
    }

    return myCell;
}

関連性のないコードの部分を削除しました。

その結果、画面に表示される最初のセルのレイアウトは適切に更新されますが、下にスクロールした後に表示されるビューのレイアウトは更新されません。

dequeueReusableCellWithIdentifierを適切に使用していませんか?それとも他に何か問題がありますか?

編集:

EJVからの解決策:

CGRect titleLabelFrame = myCell.titleLabel.frame; 

if ([buildingFName isEqual:@""])
{
    titleLabelFrame.origin.y  = 45;
} else {
    titleLabelFrame.origin.y  = 37;
}

[myCell.titleLabel setFrame:titleLabelFrame];
4

3 に答える 3

1

タイトルラベルのフレームが動的である場合、テーブルビューからセルをデキューすると、フレームは2つの状態のいずれかになります(buildingFNameが空の場合と文字が含まれている場合)。buildingFNameが空でない場合のフレームを設定していることを確認する必要があります。そうすれば、タイトルラベルのフレームは常に正しく設定されます。したがって、次のようなコードが必要です。

CGRect titleLabelFrame = myCell.titleLabel.frame;

if ([buildingFName isEqual:@""])
{ 
    titleLabelFrame.origin.y  = 45;
} else {
    // Change titleLabelFrame
}

[myCell.titleLabel setFrame:titleLabelFrame];
于 2012-07-31T22:08:00.587 に答える
1

残念ながら、セルのサブビューを適切にレイアウトするには、セルをサブクラス化し、[UITableViewCell layoutSubviews] を実装する必要があります。これは、スイッチ テーブル ビュー セルに対して同様のことを行った方法です。

- (void)layoutSubviews
{
    CGFloat const ESCFieldPadding = 10.0f;

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationBeginsFromCurrentState:YES];

    // call super layout
    [super layoutSubviews];

    // obtain widths of elements
    CGFloat contentWidth = self.contentView.frame.size.width;
    CGFloat contentHeight = self.contentView.frame.size.height;
    CGFloat switchWidth = self.switchView.frame.size.width;
    CGFloat switchHeight = self.switchView.frame.size.height;
    CGFloat labelWidth = contentWidth - (4 * ESCFieldPadding) - switchWidth;

    // correctly position both views
    self.textLabel.frame = CGRectMake(ESCFieldPadding, 0.0f, 
                                      labelWidth, contentHeight);
    // it is needed to explicitly resize font as for some strange reason,
    // uikit will upsize the font after relayout
    self.textLabel.font = [UIFont boldSystemFontOfSize:[UIFont labelFontSize]];

    CGRect switchFrame = self.switchView.frame;
    switchFrame.origin = CGPointMake(contentWidth - ESCFieldPadding - switchWidth,
                                     (contentHeight / 2) - (switchHeight / 2));
    self.switchView.frame = CGRectIntegral(switchFrame);

    [UIView commitAnimations];
}
于 2012-07-31T22:03:49.330 に答える