UITableViewCell 中的自定义 UIView 中的 CAGradientLayer 问题

Posted

技术标签:

【中文标题】UITableViewCell 中的自定义 UIView 中的 CAGradientLayer 问题【英文标题】:Problem with CAGradientLayer in a custom UIView within a UITableViewCell 【发布时间】:2010-09-17 20:25:47 【问题描述】:

我有一些特殊情况需要帮助。我有一个 CustomView,我将它放在 UITableView 中的每个 UITableViewCell 中。没有问题。

在我的 CustomView 中有一个 UILabel,它显示了一些给它的文本。根据文本的长度,CustomView 的宽度会增长/缩小。一切都好。

我遇到的问题是我的 CustomView 中有一个子层,它是一个渐变 (CAGradientLayer)。在不在视图中的单元格上,渐变大小不会增长/缩小屏幕。

让我给你看一些代码...我像这样创建我的 CustomView:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

    CustomView *custom = [[CustomView alloc] init];
    custom.tag = 777;
    [cell.contentView addSubview:custom];
    [custom release];




我在这个阶段不使用 initWithFrame,因为单元格可能会被重复使用并且宽度总是错误的。一旦单元格在那里,我调用一个方法 configureCell: 我在其中执行以下操作:

CGSize teamMaxSize = CGSizeMake(300, 18);
CGSize teamNewSize = [[managedObject valueForKey:@"category"] 
    sizeWithFont:[UIFont systemFontOfSize:kFontSizeTeam]
    constrainedToSize:teamMaxSize
    lineBreakMode:UILineBreakModeWordWrap];

CustomView *lozenge = (CustomView *) [cell.contentView viewWithTag:777];
lozenge.frame = CGRectMake(10, 5, teamNewSize.width+12, 18);
[lozenge resetSize];
[lozenge setLabel:[managedObject valueForKey:@"category"]];

这很好用,我的 CustomView 的宽度是根据“类别”键的长度设置的。重置大小;上面的方法只是简单地将我之前提到的 UILabel 调整为 CustomView 的新框架,然后再用值填充它。

无论如何,回到我的问题。我在我的 CustomView 的 drawRect: 方法中创建背景渐变。它工作正常,但是在初始化时 CustomView 的大小。调整大小后,我需要调整 gradient.frame 的大小。所以,我尝试添加

gradient.frame = self.bounds

当我在上述代码中调用 resetSize 时。但是,当滚动 UITableView 时,我可以看到渐变从左到右填充,因为它加载到视图中。无论如何我可以让这种情况发生在“屏幕外”,以便 CustomView 一出现就被渐变填充?

【问题讨论】:

【参考方案1】:

您是否考虑过使用CAGradientLayer 作为自定义视图的图层类,而不是在drawRect: 中创建渐变,例如:

+ (Class)layerClass

    return [CAGradientLayer class];

然后您可以通过self.layer 在初始化程序中执行任何渐变设置。

【讨论】:

但是我初始化CustomView的时候无法设置渐变的宽度...我要等... 我不确定我是否完全理解你想要做什么,但如果你想为你的单元格创建一个渐变背景,我建议创建一个简单的 CustomBackgroundView 类作为描述(带有CAGradientLayer 支持)并将其附加到单元格的backgroundView 属性。它应该会根据您的单元格自动调整大小,您可以在 CustomView 中完成其余的自定义绘图。 我正在我的 CustomView 的背景中创建一个渐变。将自定义视图想象成一个带有一行文本的菱形按钮。它和其他物体在我的牢房内...... 进一步考虑,gradient.frame = self.bounds 是否发生在 UIView 动画上下文中? 不,它只是在自定义方法中调整 UILabel 的大小。

以上是关于UITableViewCell 中的自定义 UIView 中的 CAGradientLayer 问题的主要内容,如果未能解决你的问题,请参考以下文章

MonoTouch 中的自定义 UITableViewCell

UITableViewCell 中的自定义 UISwitch

自定义 UITableViewCell 中的自定义 UIView

UITableViewCell 中的自定义标签问题

UITableVIewCell 重叠图像中的自定义按钮

在 Storyboard 中设计的自定义 UITableViewCell 中的自定义 UIView