你在哪里设置子视图的图层属性?为啥不在 initWithCoder 中
Posted
技术标签:
【中文标题】你在哪里设置子视图的图层属性?为啥不在 initWithCoder 中【英文标题】:Where do you set a subview's layer properties? Why not in the initWithCoder你在哪里设置子视图的图层属性?为什么不在 initWithCoder 中 【发布时间】:2013-12-17 04:55:39 【问题描述】:我创建了一个自定义UITableViewCell
(对于这个例子,假设子类是MyViewCell
),它有一个与之关联的 Nib 文件MyViewCell.xib
。笔尖包含一个UITableViewCell
和一个子视图UIView
(名为cardContainer
),它只是一个蓝色背景的矩形。我想在UIView
周围添加阴影,所以我在-initWithCoder
调用中添加了设置图层属性:
@implementation MyViewCell
- (id)initWithCoder:(NSCoder *)aDecoder
self = [super initWithCoder:aDecoder];
if (self)
[self initView];
return self;
- (void) initView
UIBezier Path*shadowPath =[UIBezierPath bezierPathWithRect:view.bounds];
[self.cardContainer.layer setShadowColor: [UIColor blackColor].CGColor];
[self.cardContainer.layer setShadowOpacity: 0.8];
[self.cardContainer.layer setShadowRadius:3.0];
[self.cardContainer.layer setShadowOffset: CGSizeMake(2.0,2.0)];
view.layer.shadowPath = shadowPath.CGPath;
@end
我遇到的问题是这些图层属性没有被绘制。如果我在awakeFromNib
或drawRect
中调用-initView
,它会按预期绘制。我的问题:为什么我的原始代码不起作用?我应该在哪里打电话initView
?是否有一些视图生命周期?我知道initWithCoder
没有连接插座,但它在运行时没有崩溃。
我通读了Apple documentation around Views 并搜索了 SO 问题,但没有找到答案。我找到了这个SO answer,但又没有解释。
【问题讨论】:
在初始化视图后尝试将其放入 cellForRowatIndexpath @suhit 我觉得影子代码应该包含在自定义视图中。我可以在其他视图控制器中重用它 你能把代码发到cellForRowatIndexpath
吗??
@johnMa cellForRowAtIndexPath
没有做任何有趣的事情。在我的 viewDidLoad
调用中,我将关联的 nib 文件注册到 UITableView
,而在 cellForRowAtIndexPath
中,我只需使用静态标识符调用 dequeueReusableCellWithIdentifier
。
【参考方案1】:
嘿,我找到了更好的方法,只需为您的子视图添加一些运行时属性cardContainer
喜欢这个
.m 文件中不再有代码。
编辑:
发件人:NSNibAwaking Protocol
重要提示:由于无法保证从存档中实例化对象的顺序,因此您的初始化方法不应向层次结构中的其他对象发送消息。可以从 awakeFromNib 中安全地向其他对象发送消息——此时可以确保所有对象都未归档并已初始化(当然,不一定要唤醒)。
【讨论】:
虽然您的解决方案“有效”,但这并不能完全回答为什么我的原始代码无效的问题 阅读NSNibWeaking Protocol后,我认为您的视图已在笔尖唤醒过程中重新建立。看看吧。NSNibAwakeningProtocol
链接真的很有帮助,谢谢。如果你想编辑关于 NSNibAwakeningProtocol 的答案,我会继续接受它【参考方案2】:
你需要添加这个,
self.cardContainer.layer.masksToBounds = NO;
【讨论】:
阴影不需要边框以上是关于你在哪里设置子视图的图层属性?为啥不在 initWithCoder 中的主要内容,如果未能解决你的问题,请参考以下文章