gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:38:37 25 4
gpt4 key购买 nike

我在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com