2012-12-06 107 views
7

我想覆蓋我的自定義視圖中的UIView的drawRect:方法。然而,我的觀點已經邊框半徑定義爲:UIView覆蓋drawRect導致視圖不服從掩碼ToBounds

sub = [[[NSBundle mainBundle] loadNibNamed:@"ProfileView" owner:self options:nil] objectAtIndex:0]; 
    [self addSubview:sub]; 
    [sub setUserInteractionEnabled:YES]; 
    [self setUserInteractionEnabled:YES]; 
    CALayer *layer = sub.layer; 
    layer.masksToBounds = YES; 
    layer.borderWidth = 5.0; 
    layer.borderColor = [UIColor whiteColor].CGColor; 
    layer.cornerRadius = 30.0; 

這完美的作品,並把一個漂亮的邊框周圍我的觀點邊框半徑(不介意對角/直白線在後面,他們沒有與該視圖做):

correct one

然而,當我嘗試重寫drawRect:方法在我看來,我可以看到一個黑色的背景不遮蔽到邊界。我沒有做任何事情(目前),這裏是我的代碼:

-(void)drawRect:(CGRect)rect{ 
    [super drawRect:rect]; 
} 

這裏是結果:

incorrect one

我改變什麼,但平局方法。我怎樣才能重寫繪製方法,同時保持我的視圖服從角圓角掩模?這是iOS中的錯誤還是我錯過了一些東西?

回答

3

我不知道完整的答案,但我知道,根據您是否實施了drawRect:或者沒有,UIView的drawLayer:inContext:的實現工作方式不同。也許掩蓋/剪裁到邊界是它做不同的事情之一。

您可以嘗試解決您的問題的一些方法:

  • 讓你的背景透明:

    layer.backgroundColor = [UIColor clearColor].CGColor; 
    
  • 剪輯自己的自定義drawRect:內:

    - (void)drawRect:(CGRect)rect { 
        [[UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:30.0] addClip]; 
        [image drawInRect:rect]; // or whatever 
    } 
    
  • 明確指出角落:

    CGContextBeginPath(c); 
    CGContextAddArc(c, r, r, r, M_PI, 3*M_PI_2, 0); 
    CGContextAddLineToPoint(c, 0, 0); 
    CGContextClosePath(c); 
    CGContextClip(c); 
    [[UIColor grayColor] setFill]; 
    UIRectFill(rect); 
    

我偷了那最後2項建議從這個偉大的表現從2010年WWDC:Advanced Performance Optimization on iPhone OS(在this index page視頻上市 - 煩人的,沒有直接的聯繫)。

1

也許你不應該叫

[super drawRect:rect] 

您的drawRect內。 Apple says是:

如果直接繼承的UIView,實現此方法 不需要調用超。但是,如果您要繼承不同的視圖類,則應該在您的 實施中的某個時刻調用super。

看來,調用超級方法會導致奇怪的行爲。

2

這是一個老問題,但我最近在閱讀一篇有用的博客文章,標題爲Abusing UIView。在這篇文章中,作者建議不要覆蓋drawRect做一些事情,比如在有其他方式的時候添加邊框。他說,

覆蓋drawRect:導致性能下降。我還沒有分析它,所以我不知道它是否在正常的 情況下(這可能不是),但是在大多數情況下,012xx覆蓋drawRect:的人可以通過 更容易地完成他們想要的設置屬性在視圖的圖層屬性上。如果你需要周圍畫一個圖的輪廓 ,這裏是你會怎麼做:

#import <QuartzCore/QuartzCore.h> 

- (id)initWithFrame:(CGRect)frame { 
    self = [super initWithFrame:frame]; 
    if (self) { 
     self.layer.borderWidth = 2.f; 
     self.layer.borderColor = [UIColor redColor].CGColor; 
    } 
    return self; 

我意識到這可能不能解決顯示了穿過黑色背景的問題。這只是別的想法。

1

在視圖設置

opaque = false // NO for ObjC 

解決了這個問題。

+0

這是正確的答案。 – Randy