iOS UITableViewCell布局更新

时间:2015-09-08 08:44:14

标签: ios uitableview

我在UITableViewCell中使用自定义按钮(扩展UIButton)。此按钮具有方法updateLayout,它添加了一些图形调整(边框,图像,边缘插入,......)。

我在

中调用此updateLayout方法
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    ProfileSelect *cityButton = (ProfileSelect *)[cell viewWithTag:4];

    [cityButton updateLayout];
}

当我动态地向表中添加新单元格时,按钮未正确显示(某些属性正常,有些属性不正确)。

当我添加另一个新单元格时,上一个按钮会更新其布局并正确显示。然而,新的问题也存在同样的问题。

我应该在哪里调用自定义updateLayout方法来正确显示按钮?

3 个答案:

答案 0 :(得分:1)

我不相信在这里使用标签,我认为每个viewController的标签可能必须是唯一的,而不是每个视图因此你会覆盖你的视图标签,这可能会导致你的意外行为。

我建议你继承UITableViewCell并给它一个cityButton属性。 然后你的代码应该像你的

一样工作
$.get('/api/operatives/').done(function (result) {
    viewModel.operatives(result);
});

答案 1 :(得分:1)

如果按钮的边框,插图完全相同,最好在自定义单元格中设置它们,如果它是Nib或-(void)awakeFromNib,则覆盖- (void)layoutSubviews如果以编程方式。

如果根据您的数据决定它们是不同的,那么您可以在- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath中设置它们,因为单元格被重用,所以不要混淆数据源。

答案 2 :(得分:0)

我能够通过向UIButton + RuntimeAttribute添加类别来解决此问题。

我使用Xcode 用户定义的运行时属性来定义所需的参数:

enter image description here

并覆盖类别中的setter方法以更新布局:

- (void)setBorderBottom:(BOOL)borderBottom
{
    UIView *border = [UIView new];
    border.backgroundColor = [UIColor colorWithHexString:@"808080"];
    [border setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin];
    border.frame = CGRectMake(0, self.frame.size.height - borderWidth, self.frame.size.width, borderWidth);
    [self addSubview:border];
}

- (void)setBorderLeftFaded:(BOOL)borderLeftFaded
{
    [self setImage:[UIImage imageNamed:@"text_field_left_border"] forState:UIControlStateNormal];
}

- (void)setContentPadding:(float)contentPadding
{
    [self setTitleEdgeInsets:UIEdgeInsetsMake(0.0, contentPadding, 0.0, contentPadding)];
}