gpt4 book ai didi

iphone - UITableViewCell 上的 selectedBackgroundView 应用于单元格中的所有 View

转载 作者:行者123 更新时间:2023-12-03 18:54:43 25 4
gpt4 key购买 nike

我显示了一个表格单元格,其中显示了用户图像、名称和一些文本。用户的图像为 50x50,但我想要在其周围有边框,因此我将 View 设置为图像居中并将框架设置为 52x52,然后将该 View 的背景颜色设置为边框颜色。这会在图像周围显示 1 像素边框。

我还想在选择单元格时在单元格右侧显示 30 像素宽的边框。我尝试通过创建一个单元格框架大小的 UIView 来做到这一点,然后使用我想要的宽度和背景颜色的 UIView 添加一个 subview 到该 View 。然后,我将该 View 设置为单元格的 selectedBackgroundView。

这里的问题是单元格的 selectedBackgroundView 被应用于单元格内所有 View 的背景。因此,当我选择一个单元格时,图像“边框”将设置为单元格选定的背景颜色,我添加的其他 30px“边框”也会更改为该背景颜色。

我的 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];

最佳答案

我假设您尚未实际测试正在发生的情况以形成您的分析,即它“应用于单元格内所有 View 的背景”。

我做了这样的事情:

@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;

最终结果是,当选择 View 时,从 -[UITableViewCell _setOpaque:forSubview:] 调用 -setBackgroundColor: ,类似于 UIDeviceWhiteColorSpace 0 0(即[UIColor clearColor])。

或者,换句话说,当单元格被选中时,某些 subview 的背景颜色被设置为[UIColorclearColor],从而允许selectedBackgroundView显示出来。我认为发生这种情况是因为常见的优化是为 textLabel/detailTextLabel 提供表格的背景颜色(例如白色),以便绘制速度更快,但是这个意味着选择单元格时必须重置背景颜色。

最简单的解决方法是使用图像:UIImageView 中正确颜色的 1×1 像素图像将起作用,如果有点困惑的话。 (我在使用 1 像素高的 UIView 绘制自定义分隔线时遇到了这个问题,所以我只是将分隔线包含到背景图像中。)

另一种修复方法是使用 CALayer:将 52x52 子图层添加到 UIImageView 的图层中,并设置子图层的背景颜色。我很确定 UITableViewCell 只是遍历 View 层次结构,因此它应该忽略自定义层。 (图层的一大缺点是它们不会自动调整大小,这使得它们不适合我的目的,并且意味着 30px 右边框不会自动调整大小。)

解决方法是对相关 View 进行子类化,并忽略 -setBackgroundColor:(如果它等于 [UIColor clearColor])。

关于iphone - UITableViewCell 上的 selectedBackgroundView 应用于单元格中的所有 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4052907/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com