tableView 作为半透明视图中的子视图

Posted

技术标签:

【中文标题】tableView 作为半透明视图中的子视图【英文标题】:tableView as subview in a semi-transparent view 【发布时间】:2012-12-12 19:13:46 【问题描述】:

我正在开发一个小的 ios 组件,但我遇到了带有子视图的半透明视图的问题。这是我的场景: - 一个使用[UIColor colorWithRed:green:blue:alpha]的半透明背景视图 - 一点点UITableView,带有alpha = 1.0,作为子视图添加到半透明视图中 - 其他一些子视图

一切正常,但是当UITableView 向上或向下滚动时问题就出现了,实际上UITableView 周围的半透明视图区域失去了透明度,变得比原来的背景颜色更暗。

这是解释问题的图片:

用两个箭头看空间...

谁能帮我解决这个问题? 非常感谢您的关注!

更新: 部分代码:

_alertBg = [[UIView alloc] initWithFrame:CGRectZero];
_alertBg.backgroundColor = self.backgroundColor;
_alertBg.frame = CGRectMake((_bgView.frame.size.width - 240) / 2, (_bgView.frame.size.height - 260) / 2, 240, 260);
_alertBg.layer.cornerRadius = 8.0;
_alertBg.layer.borderWidth = 2.0;
_alertBg.layer.borderColor = self.borderColor.CGColor;
_alertBg.layer.shadowColor = [UIColor grayColor].CGColor;
_alertBg.layer.shadowOffset = CGSizeMake(0, 3);
_alertBg.layer.shadowOpacity = 0.8;
_alertBg.layer.masksToBounds = YES;
[_bgView addSubview:_alertBg];

_table = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];
_table.frame = CGRectMake(10, _titleLabel.frame.origin.y + _titleLabel.frame.size.height + 12, _alertBg.frame.size.width - 20, 150);
_table.layer.cornerRadius = 6.0;
_table.layer.masksToBounds = YES;
_table.delegate = self;
_table.dataSource = self;
[_alertBg addSubview:_table];

从上面的代码来看,self.backgroundColor 类似于[UIColor colorWithRed:0 green:0 blue:1 alpha:0.7]

【问题讨论】:

可能有助于查看这些视图是如何创建的,CGRect 信息。 IB还是程序化建设? 一切都是使用简单的视图和一些 QuartzCore 代码完成的,没有 IB 或 CGRect...我已经编辑了帖子并添加了一些代码 @matteodv 请添加一些 cellForRawAtIndexPath 方法的代码并发表评论 【参考方案1】:

我将可用代码放在一个测试项目中,遇到了和你一样的问题。注释掉 _alertBg.layer.shadowOpacity = 0.5; 为我解决了这个问题。也许有人可以澄清为什么这是一个问题,我对 QuartzCore 的经验有限。

编辑:好的,稍微接近真正的原因。似乎如果您没有设置_alertBg.layer.shadowPath 属性,当您滚动表格时会发生各种疯狂的事情(我的猜测是表格滚动调用_alertBg 的重绘并且调用了阴影重绘快速连续太多次,你会得到那些视觉伪影)。

添加shadowPath 可以解决问题,因此_alertBg 的层代码应如下所示:

_alertBg.layer.cornerRadius = 8.0;
_alertBg.layer.borderWidth = 2.0;
_alertBg.layer.borderColor = [UIColor colorWithRed:0 green:0 blue:1 alpha:0.7].CGColor;
_alertBg.layer.shadowColor = [UIColor grayColor].CGColor;
_alertBg.layer.shadowOffset = CGSizeMake(0, 5);
_alertBg.layer.shadowOpacity = 0.8;
_alertBg.layer.shadowPath = [UIBezierPath bezierPathWithRect:_alertBg.bounds].CGPath;
_alertBg.layer.masksToBounds = YES;

只需根据自己的喜好修改shadowPath,您就可以开始使用了。

PS:在我的 Google-quest 中,我发现 this excellent blog post 关于阴影,它可能会有所帮助。

【讨论】:

非常感谢...这正是我想要的,我解决了问题!再次感谢!【参考方案2】:

也许tableView的背景颜色与_alertBg相匹配?

【讨论】:

【参考方案3】:

可能是dequeueReusableCellWithIdentifier的问题。

试试这个...,将dequeueReusableCellWithIdentifier 设置为nil 就像在cellForRowAtIndexPath 方法的UITableViewController 委托方法中一样

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:nil];

另见我的这个答案可能是你可以从中得到一些想法..

iPhone Hide/Show labels in Uitableview cell

【讨论】:

以上是关于tableView 作为半透明视图中的子视图的主要内容,如果未能解决你的问题,请参考以下文章

如何添加不会破坏且不受AutoLayout影响的半透明背景的子视图?

创建一个像 UINavigationBar 这样的半透明视图

推送视图控制器中的半透明导航栏覆盖?

UIPrintInteractionController半透明条问题

UIPrintInteractionController 半透明条问题

swift 4.2 ios 12中的状态栏模糊视图(半透明)