2010-10-29 22 views
4

我有一个显示用户图像,名称和一些文本的表格单元格。用户的图像是50x50,但我想要一个边框,所以我将视图设置为居中图像并将帧设置为52x52,然后将该视图的背景颜色设置为我的边框颜色。这显示了图像周围的1像素边框。UITableViewCell的selectedBackgroundView获取应用于单元格中的所有视图

我也想在单元格被选中时在单元格的右边显示一个30像素宽的边框。我试图通过创建一个UIView单元框架的大小,然后添加一个子视图到UIView的宽度和背景颜色,我想。然后我将该视图设置为单元格的selectedBackgroundView。

这里的问题是,单元格的selectedBackgroundView被应用到单元格内所有视图的背景。所以当我选择一个单元格时,图像“边框”被设置为单元格的选定背景颜色,我添加的另一个30像素“边框”也被更改为该背景颜色。

代码我的cellForRowAtIndexPath里面:

cell = (UserCellView *) currentObject; 

UIView *c = [[UIView alloc ] initWithFrame:CGRectMake(0, 0, 30, cell.frame.size.height)]; 
c.backgroundColor = [[UIColor alloc] initWithRed:64/255.0 green:64/255.0 blue:64/255.0 alpha:1.0]; 

UIView *v = [[UIView alloc ] initWithFrame:cell.frame];    
v.backgroundColor = [[UIColor alloc] initWithRed:35/255.0 green:35/255.0 blue:35/255.0 alpha:1.0];    

[v addSubview:c];  

cell.selectedBackgroundView = v; 

[c release]; 
[v release]; 

回答

-5

你将需要自定义单元格的内容查看和处理委托tableView:cellForRowAtIndexPath

See Posting Here

+0

你能有更多的解释?我如何设置contentView上的backgroundView? – JasonB 2010-10-29 15:32:47

10

我假设你没有实际上测试了发生了什么事情来形成你的分析,它“适用于单元格内所有视图的背景”。

我确实是这样的:

@interface TestView : UIView { 
} 
@end 
@implementation TestView 
-(void)setBackgroundColor:(UIColor*)c { 
    // Breakpoint here. 
    NSLog("setBackgroundColor: %@",c); 
    [super setBackgroundColor:c]; 
} 
@end 

... 

UIView * v = [[[UIView alloc] initWithFrame:(CGRect){{0,0},{20,20}}] autorelease]; 
v.backgroundColor = [UIColor magentaColor]; 
UIView * v2 = [[[TestView alloc] initWithFrame:(CGRect){{5,5},{10,10}}] autorelease]; 
v2.backgroundColor = [UIColor yellowColor]; 
[v addSubview:v2]; 
cell.selectedBackgroundView = v; 

最终的结果是,-setBackgroundColor:-[UITableViewCell _setOpaque:forSubview:]称为被选择的视图的情况下,与像UIDeviceWhiteColorSpace 0 0(即[UIColor clearColor])。

或换言之,当选中单元格时,某些子视图的背景颜色设置为[UIColor clearColor],允许selectedBackgroundView显示。我想认为发生这种情况是因为常见的优化是给予表的背景颜色(例如白色),以便绘制得更快,但这意味着在选择单元格时必须重置背景颜色。

最简单的解决方法是使用图像代替:如果有点混乱,UIImageView中正确颜色的1×1像素图像将起作用。 (I绘制与1象素高UIViews定制隔板线时有这样的问题,所以我只包括在分离器进入的背景图像。)

一个替代解决办法是使用一个的CALayer代替:一个52x52子层添加到所述UIImageView的图层,并设置子图层的背景颜色。我非常确定UITableViewCell只是走视图层次结构,所以它应该忽略自定义图层。 (图层最大的缺点是它们不会自动调整大小,这使得它们不适合我的目的,并且意味着30像素的右边框不会自动调整大小。)

解决方法是将相关视图如果它等于[UIColor clearColor],则忽略-setBackgroundColor:

+3

这就是答案。我刚刚发现相同的问题,并以相同的结果结束。原因可能是允许selectedBackgroundView显示,但仍然是一个糟糕的(和未公开的)UI组件设计。 – Sulthan 2012-05-26 18:35:00

+1

死了。结论可能是不依赖于tableView中的backgroundColor(也可能在其他视图中)。我想使用空白UIView的backgroundColor作为颜色指示器,但每当我弹回到tableView后颜色都会重置。原来,取消选择动画会将backgroundColor重置为选择动画开始之前的值。因此,如果在选择动画的开始和取消选择动画的结束之间设置backgroundColor,它将被覆盖。我现在要使用CALayer。 – 2013-03-06 09:49:31

1

一个简单但令人讨厌的解决方案是覆盖setSelected:animated:和setHighlighted:animated:通过实现重新设置所需的各种背景。沿着线的东西:

- (void)setSelected:(BOOL)selected animated:(BOOL)animated 
{ 
    [super setSelected:selected animated:animated]; 
    self.childView.backgroundColor = [UIColor blueColor]; // whichever you want 
} 
1

首先添加到您的文件

#import <QuartzCore/QuartzCore.h>

然后把你的观点成图像...

UIView *rowView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, 1.0, 60.0)]; 
    rowView.backgroundColor = [UIColor colorWithRed:35/255.0 green:35/255.0 blue:35/255.0 alpha:1.0];   

    UIGraphicsBeginImageContext(rowView.bounds.size); 
    [rowView.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *yourImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

然后,而不是添加的一个UIView到你的单元格,只需添加一个带有“yourImage”的UIImageView即可。

0

一个简单的解决方案,如果受影响的视图可以是自定义的子类覆盖-setBackgroundColor:

- (void)setBackgroundColor:(UIColor *)color 
{ 
    // Ignore requests and do nothing 
} 

因此UITableViewCell的企图设置颜色会去理会。在自定义视图代码确实要设置背景颜色需要调用super

- (void)setColor:(UIColor *)color 
{ 
    [super setBackgroundColor:color]; 
} 

(或很可能消息直接底层CALayer

相关问题