簡體   English   中英

UIView類別和陰影-兩次應用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM