你在哪里设置子视图的图层属性?为啥不在 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

我遇到的问题是这些图层属性没有被绘制。如果我在awakeFromNibdrawRect 中调用-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 中的主要内容,如果未能解决你的问题,请参考以下文章

如何更新 UIView 的图层属性并为其子视图保留图层?

arcgis怎么关闭关联

为啥在子视图中添加图层蒙版时需要调用 layoutIfNeeded()?

CALayer 详解

arcpy设置图层的符号系统

你在哪里初始化视图控制器中的属性值?