我创建了一个自定义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
我遇到的问题是没有绘制这些图层属性。如果我在-initView
或awakeFromNib
内拨打drawRect
来电,则会按预期进行调用。我的问题:为什么我的原始代码不起作用?我应该在哪里打电话initView
?是否有一些视图生命周期?我知道initWithCoder
没有连接插座,但它在运行时没有崩溃。
我通过Apple documentation around Views阅读,并在没有找到答案的情况下搜索了SO问题。我发现了这个SO answer,但是我再也没有解释。
答案 0 :(得分:3)
嘿我找到了更好的方法,只需为子视图添加一些运行时属性cardContainer
喜欢这个
不再有.m文件中的代码了。
修改强>
重要说明:由于无法保证从归档中实例化对象的顺序,因此初始化方法不应将消息发送到层次结构中的其他对象。可以从awakeFromNib中安全地发送到其他对象的消息 - 这时确保所有对象都被取消存档并初始化(当然,不一定被唤醒)。
答案 1 :(得分:0)
您需要添加此内容,
self.cardContainer.layer.masksToBounds = NO;