自定义UITableViewCell:如何正确实现layoutSubviews?

时间:2015-03-22 19:04:13

标签: ios objective-c xcode uitableview autolayout

我有自定义UITableViewCell,我已覆盖layoutSubviews并手动计算了子视图的坐标。它工作..但只有当我使用滚动或点击它时,单元格才会更新。此外,当我更改方向时,单元格保持不更新状态。

我尝试过为子视图使用自动布局。并且它工作正常,并且单元格按预期更新:也可以更改方向。

但是......我想使用layoutSubviews ..因为在我的情况下,IB的几十年的限制是一种令人头痛的问题。

那么我应该如何处理layoutSubviews以获得我的自定义单元格的预期行为?

我尝试使用不同的更新,其他问题建议使用,但没有人解决我的问题。

这是我的代码:

- (void)layoutSubviews
{
    [super layoutSubviews];

    NSLog(@"------ cell layout subviews ------");

    //self.selectedBackgroundView.frame = CGRectMake(10.0f, 0, 300, 80);

    CGRect frame = basketButton.frame;
    int parentX1 = 0;
    int parentY1 = 0;
    int parentX2 = self.contentView.bounds.size.width;
    int parentY2 = self.contentView.bounds.size.height;

    NSLog(@"parentX2: %d", parentX2);
    NSLog(@"contentView: %f", self.contentView.frame.size.width);

    int x, y, h, w;
    int gap = 10;

    w = 80;
    h = 30;
    x = parentX2 - gap - w;
    y = parentY2/2 - h/2;
    frame = CGRectMake( x, y, w, h );
    basketButton.frame = frame;

    //NSLog(@"basckeButtonX2: %f", frame.origin.x);

    w = 60;
    h = 15;
    x = frame.origin.x - gap - w;
    y = parentY2/2 - h/2;
    frame = CGRectMake( x, y, w, h );
    priceLabel.frame = frame;

    w = 72;
    h = 72;
    x = gap;
    y = gap;
    frame = CGRectMake(x, y, w, h);
    imageView.frame = frame;

    x = imageView.frame.origin.x + imageView.frame.size.width + gap;
    y = gap;
    w = priceLabel.frame.origin.x - gap - x;
    h = parentY2 - gap*2;
    frame = CGRectMake(x, y, w, h);
    nameLabel.frame = frame;
}
控制器中的

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *MyIdentifier = @"ProductCell";

    ProductCell* cell = [tableView dequeueReusableCellWithIdentifier:@"ProductCell"];

    NSArray* productsByTableView = [self getProductsByTableView: tableView];
    Product* product = [productsByTableView objectAtIndex:indexPath.row];
    cell.nameLabel.text = product.name;

    CGRect frame = cell.frame;
    frame.size.width = tableView.frame.size.width;
    cell.frame = frame;

    [cell setNeedsLayout];
    [cell setNeedsDisplay];

    return cell;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    ProductCell* cell = [tableView dequeueReusableCellWithIdentifier:@"ProductCell"];

    CGRect frame = cell.frame;
    frame.size.width = tableView.frame.size.width;
    cell.frame = frame;

    [cell setNeedsLayout];
    [cell setNeedsDisplay];
    //[cell layoutSubviews];

    return cell.bounds.size.height;
}

0 个答案:

没有答案