UITableViewCell自定义子类视图未更新

时间:2012-07-31 21:59:04

标签: iphone ios uitableview

在我的自定义表视图单元子类中,其中一个textlabel的位置取决于ivar(NSString)的内容。 (即:如果NSString是空字符串,则textlabel框架的位置不同)。

如果更新的位置如下:

- (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];

3 个答案:

答案 0 :(得分: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];
}

答案 1 :(得分:1)

如果标题标签的框架是动态的,那么当您从表格视图中取出单元格时,该框架可能处于两种状态中的任何一种状态(当buildingFName为空且具有字符时)。您需要确保在buildingFName不为空时设置框架。这样,标题标签的框架将始终正确设置。所以,你需要这样的代码:

CGRect titleLabelFrame = myCell.titleLabel.frame;

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

[myCell.titleLabel setFrame:titleLabelFrame];

答案 2 :(得分:0)

尝试从您的手机中禁用自动布局