你在哪里设置子视图的图层属性?为什么不在initWithCoder中

时间:2013-12-17 04:55:40

标签: ios objective-c uiview uitableview custom-controls

我创建了一个自定义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

我遇到的问题是没有绘制这些图层属性。如果我在-initViewawakeFromNib内拨打drawRect来电,则会按预期进行调用。我的问题:为什么我的原始代码不起作用?我应该在哪里打电话initView?是否有一些视图生命周期?我知道initWithCoder没有连接插座,但它在运行时没有崩溃。

我通过Apple documentation around Views阅读,并在没有找到答案的情况下搜索了SO问题。我发现了这个SO answer,但是我再也没有解释。

2 个答案:

答案 0 :(得分:3)

嘿我找到了更好的方法,只需为子视图添加一些运行时属性cardContainer

喜欢这个enter image description here

不再有.m文件中的代码了。

修改

自:NSNibAwaking Protocol

  

重要说明:由于无法保证从归档中实例化对象的顺序,因此初始化方法不应将消息发送到层次结构中的其他对象。可以从awakeFromNib中安全地发送到其他对象的消息 - 这时确保所有对象都被取消存档并初始化(当然,不一定被唤醒)。

答案 1 :(得分:0)

您需要添加此内容,

self.cardContainer.layer.masksToBounds = NO;