UIView类别和投影 - 正在应用两次

时间:2013-11-18 14:57:31

标签: ios objective-c uiview categories objective-c-category

我在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运行多次?有什么建议吗?

1 个答案:

答案 0 :(得分:1)

我假设您从调用每个屏幕旋转的方法(例如 - layoutSubview)调用它吗? 每次旋转屏幕时,方法drawRect:layoutSubviews都会调用。

将方法调用移至awakeFromNib方法,应该可以正常工作。

修改

就像你在评论中设置的那样,如果你从代码构建界面,并使用layoutSubviews来调用阴影,你可以检查阴影是否加载而没有额外的bool标志。请检查:

-(void)layoutSubviews {
    [super layoutSubviews];

    if(!self.layer.shadowPath) {
        [self addDropShadowWithOffset:1.0];
    }
}

但是,如果您通过旋转更改大小,则可能需要在其后重绘阴影。如果你想这样做,只需使用与上面相同的机制。

<强> EDIT2

这是一个想法。也许如果你想只绘制一次你应该覆盖初始化器。这是一次性通话方法。