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