我在UIView上创建了一个类别,允许我在视图中添加阴影。我的阴影代码如下所示:
-(void)addDropShadowWithOffset:(CGFloat)offset {
UIBezierPath *shadowPath = [UIBezierPath bezierPathWithRect:self.bounds];
self.layer.masksToBounds = NO;
self.layer.shadowColor = [UIColor blackColor].CGColor;
self.layer.shadowOffset = CGSizeMake(0.0f, offset);
self.layer.shadowOpacity = 0.5f;
self.layer.shadowPath = shadowPath.CGPath;
}
效果很好。但是,我注意到当我旋转屏幕时,阴影会重新绘制。旋转它越多,重新绘制的阴影就越多,导致阴影比我原先想要的要大得多。
我最初想过将BOOL iVar添加到可以跟踪阴影是否已经绘制的类别中。但是,似乎我无法将iVars添加到类别中。那么,如何防止这个代码每个UIView运行多次?有什么建议吗?
答案 0 :(得分:1)
我假设您从调用每个屏幕旋转的方法(例如 - layoutSubview)调用它吗?
每次旋转屏幕时,方法drawRect:
和layoutSubviews
都会调用。
将方法调用移至awakeFromNib
方法,应该可以正常工作。
修改强>
就像你在评论中设置的那样,如果你从代码构建界面,并使用layoutSubviews
来调用阴影,你可以检查阴影是否加载而没有额外的bool标志。请检查:
-(void)layoutSubviews {
[super layoutSubviews];
if(!self.layer.shadowPath) {
[self addDropShadowWithOffset:1.0];
}
}
但是,如果您通过旋转更改大小,则可能需要在其后重绘阴影。如果你想这样做,只需使用与上面相同的机制。
<强> EDIT2 强>
这是一个想法。也许如果你想只绘制一次你应该覆盖初始化器。这是一次性通话方法。