0

我有表格视图,其中每个单元格都有渐变背景,并且当单元格大小相同时它可以工作。我对另一个数据集和可变单元格大小使用相同的表格视图。如果我将渐变代码放在自定义单元格的 initwithcoder 中,那么它会为原始单元格的大小创建一个渐变。我尝试了不同的东西,但无法获得合适的尺寸。唯一的答案是在 cellForRowAtIndexPath 内部创建一个临时框架,其中单元格的高度来自基于文本计算它的方法。我试图弄清楚为什么 cellForRowAtIndexPath 内的单元格高度不正确。这是使其更清晰的代码。

    - (UITableViewCell *)tableView:(UITableView *)tableView
             cellForRowAtIndexPath:(NSIndexPath *)indexPath
                            object:(PFObject *)object 
    { 
        static NSString *CellIdentifier = @"feedCell";
        FeedTableViewCell *cell = (FeedTableViewCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            cell = [[FeedTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        }
        [[cell.contentView viewWithTag:999]removeFromSuperview];
        // Configure the cell...
        UIFont *cellFont = [UIFont fontWithName:@"Helvetica" size:16.0];
        cell.signText.font = cellFont;
        CGRect lblFrame = cell.signText.frame;
        lblFrame.size.height = [self labelHeightForText:[object objectForKey:@"text"]];
        cell.signText.frame = lblFrame;
        cell.signText.lineBreakMode = NSLineBreakByWordWrapping;
        cell.signText.text = [object objectForKey:@"text"];
        UIColor *grayLightOp = [UIColor colorWithRed:0.863 green:0.841 blue:0.812 alpha:1.000];
        CAGradientLayer *gradient = [CAGradientLayer layer];
//here is the tempFrame that i am talking about i can't just set tempFrame = cell.contentView.frame
        CGRect tempFrame = CGRectMake(cell.contentView.frame.origin.x, cell.contentView.frame.origin.y, cell.contentView.frame.size.width, [self labelHeightForText:[object objectForKey:@"text"]]);
        gradient.frame = tempFrame;
        gradient.colors = [NSArray arrayWithObjects:(id)[UIColor whiteColor].CGColor, (id)grayLightOp.CGColor, nil];
        UIView *backgroundView = [[UIView alloc]initWithFrame:gradient.frame];
        backgroundView.tag = 999;
        [backgroundView.layer insertSublayer:gradient above:0];
        [cell.contentView insertSubview:backgroundView atIndex:0];
        [cell.backgroundView setNeedsDisplay];
        return cell;
    }

    -(CGFloat)labelHeightForText:(NSString *)text
    {
        UIFont *cellFont = [UIFont fontWithName:@"Helvetica" size:16.0];
        CGSize constraintSize = CGSizeMake(280.0f, MAXFLOAT);
        CGSize labelSize = [text sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:NSLineBreakByWordWrapping];
        return labelSize.height + 20;
    }

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        PFObject *feedObject = [self objectAtIndexPath:indexPath];
        NSString *cellText = [feedObject objectForKey:@"text"];
        return [self labelHeightForText:cellText];
    }

======更新我在 cellForRowAtIndexPath 中注释掉了渐变的创建,这是来自自定义单元格的代码。我想我必须调整渐变本身而不是背景视图的大小。当我这样做时,渐变大小是正确的,但是当我滚动时,我会看到当单元格出现时正在绘制渐变的快速动画。我能做点什么吗?

@interface FeedTableViewCell()

@property (nonatomic, strong)CAGradientLayer *cellGradient;

@end

@implementation FeedTableViewCell

@synthesize signText = _signText;
@synthesize personName = _personName;
@synthesize personImageView = _personImageView;
@synthesize cellGradient = _cellGradient;

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // Initialization code
    }
    return self;
}
-(id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];

    if (self) {
        UIColor *grayLightOp = [UIColor colorWithRed:0.863 green:0.841 blue:0.812 alpha:1.000];
        self.cellGradient = [CAGradientLayer layer];

        self.cellGradient.frame = self.contentView.frame;
        self.cellGradient.colors = [NSArray arrayWithObjects:(id)[UIColor whiteColor].CGColor, (id)grayLightOp.CGColor, nil];
        UIView *backgroundView = [[UIView alloc]initWithFrame:self.cellGradient.frame];
        backgroundView.tag = 998;
        [backgroundView.layer insertSublayer:self.cellGradient above:0];
        self.backgroundView = backgroundView;
        //[self.layer insertSublayer:gradient atIndex:0];

    }
    return self;
}

-(void)layoutSubviews
{
    [super layoutSubviews];

    [CATransaction begin];
    [CATransaction setDisableActions:YES];
    self.cellGradient.frame = self.contentView.frame;
    [CATransaction commit];
}

// 用没有背景视图的新代码更新

-(id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];

    if (self) {
        UIColor *grayLightOp = [UIColor colorWithRed:0.863 green:0.841 blue:0.812 alpha:1.000];
        CAGradientLayer *gradient = [CAGradientLayer layer];
        gradient.frame = self.frame;
        gradient.colors = [NSArray arrayWithObjects:(id)[UIColor whiteColor].CGColor, (id)grayLightOp.CGColor, nil];
        /*UIView *backgroundView = [[UIView alloc]initWithFrame:gradient.frame];
        [backgroundView.layer insertSublayer:gradient above:0];
        self.backgroundView = backgroundView;
        [backgroundView.layer insertSublayer:gradient atIndex:0];*/
        [self.layer insertSublayer:gradient atIndex:0];
    }
    return self;
}
4

2 回答 2

0

这里发生了很多事情,但在这种情况下,您的框架原点是错误的。您将渐变的位置设置为 contentView 位置,但该位置是相对于 contentView 的父级的,而您真正想要的是在 contentView内部从 0,0 开始。您可以将contentView.bounds其用作框架,因为它只为您提供大小,位置为 0。

我要检查的另一件事是在渐变视图上自动调整掩码大小,以防在 tableview 将新框架应用于单元格时它没有调整大小。

于 2012-11-21T04:27:42.660 回答
0

最好在单元格的 init 方法中创建一次渐变层。在单元格的方法中调整它的大小layoutSubviews(首先调用super)。

您现在这样做的方式会导致滚动性能不佳,因为您每次都在重新创建渐变层。

您更新的问题中的代码几乎可以,但是您可以看到渐变调整大小的动画。这是因为您正在更改 CALayer 的动画属性 - 这些更改默认情况下是动画的。您可以通过将更改包装在 CATransaction 中并禁用隐式动画来防止这种情况:

-(void)layoutSubviews
{
    [super layoutSubviews];
    NSArray *layers = [self.backgroundView.layer sublayers];
    CAGradientLayer *gradient = [layers objectAtIndex:0];

    [CATransaction begin];
    [CATransaction setDisableActions:YES];
    gradient.frame = self.contentView.frame;
    [CATransaction commit];

}
于 2012-11-21T07:42:47.120 回答