[英]UIView categories and drop shadow — being applied twice
我在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多次運行此代碼? 有什么建議么?
我假設您是通過每次屏幕旋轉都需要調用的方法(例如-layoutSubview)調用它的,對嗎? 每當旋轉屏幕時,都會調用一次drawRect:
和layoutSubviews
方法。
將您的方法調用移至awakeFromNib
方法,應該可以正常工作。
編輯:
就像您在注釋中設置一樣,如果您通過代碼構建界面,並使用layoutSubviews
調用shadow,則可以檢查是否加載了沒有附加bool標志的shadow。 只需檢查:
-(void)layoutSubviews {
[super layoutSubviews];
if(!self.layer.shadowPath) {
[self addDropShadowWithOffset:1.0];
}
}
但是,如果例如通過旋轉更改大小,則可能要在陰影之后重繪陰影。 如果要執行此操作,請使用與上述相同的機制。
EDIT2
這是一個主意。 也許如果只想繪制一次,則應該覆蓋初始化程序。 這是一次性調用方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.