ios - UIView 类别和投影——应用两次

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

我在 UIView 上创建了一个类别,允许我向 View 添加投影。我的阴影代码如下所示:

-(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,这样我就可以跟踪是否已经绘制了阴影。但是,似乎我无法将 iVar 添加到类别中。那么,如何防止此代码在每个 UIView 中运行多次?有什么建议吗?

最佳答案

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

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

编辑:

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

-(void)layoutSubviews {
    [super layoutSubviews];

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

但是,如果您通过旋转改变大小,您可能需要在它之后重新绘制阴影。如果您想这样做,只需使用与上述相同的机制即可。

EDIT2

这是一个想法。也许如果你只想绘制一次你应该覆盖初始化程序。这是一次性调用方法。

关于ios - UIView 类别和投影——应用两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20050831/

相关文章:

ios - 如何在 iphone 中以编程方式执行复制/粘贴功能?

ios - 复制 UITableViewCell

ios - 如何暂停和恢复多个 NSTimer?

objective-c - 将 objective-c 编译成dylib

ios - UIBlurEffect 也模糊文本?

ios - dyld : Library not loaded: @rpath/Alamofire. 框架/Alamofire

iphone - 如何在按钮 addTarget 方法上将 NSString 值从一种方法传递到另一种方法?

iOS 应用程序因 "CFNetwork"而崩溃

iphone - 隐藏的 UITabBar 仍然裁剪放在它上面的任何 UIView

iphone - 推送新的 UIVIew 时禁用所有交互 UIViewcontroler