Ios UIView重写drawRect会导致视图不服从masksToBounds
我正在尝试覆盖自定义视图中UIView的Ios UIView重写drawRect会导致视图不服从masksToBounds,ios,uiview,ios6,drawrect,Ios,Uiview,Ios6,Drawrect,我正在尝试覆盖自定义视图中UIView的drawRect:方法。但是,“我的视图”的边界半径定义为: sub = [[[NSBundle mainBundle] loadNibNamed:@"ProfileView" owner:self options:nil] objectAtIndex:0]; [self addSubview:sub]; [sub setUserInteractionEnabled:YES]; [self setUserInteractio
drawRect:
方法。但是,“我的视图”的边界半径定义为:
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;
这非常有效,在我的视图周围放置了一个漂亮的边界,边界半径为(不要介意后面的对角线/直线白线,它们与此视图无关):
但是,当我试图覆盖视图中的drawRect:
方法时,我可以看到黑色背景没有遮住边界。我不做任何事(目前),以下是我的代码:
-(void)drawRect:(CGRect)rect{
[super drawRect:rect];
}
结果如下:
我只改变了画法。如何在保持视图服从角半径遮罩的同时替代绘制方法?这是iOS中的一个bug还是我遗漏了什么?我不知道完整的答案,但我知道UIView对
drawLayer:inContext:
的实现根据您是否实现了drawRect:
而工作方式有所不同。也许屏蔽/剪裁到边界是它所做的不同的事情之一
您可以尝试通过多种方式解决问题:
- 使背景透明:
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);
我从WWDC 2010的精彩演示中偷取了最后两条建议:(视频列在--恼人的是,没有直接链接)。也许你不应该打电话给
[super drawRect:rect]
在你的抽屉里。即:
如果您直接将UIView子类化,那么您的方法实现
不需要叫超级。但是,如果您正在子类化
不同的视图类,您应该在视图中的某个点调用super
实施
调用超级方法似乎会导致奇怪的行为。这是一个老问题,但我最近读了一篇有用的博客文章,标题是。在这篇文章中,作者建议不要重写
drawRect
,在有其他方法的情况下添加边框。他说,
重写drawRect:
会导致性能下降。我还没有分析它,
所以我不知道在正常情况下这是否是一个显著的表现
环境(可能不是),但在大多数情况下
overridedrawRect:
可以更轻松地完成他们想要的任务
设置视图图层特性的特性。如果你需要画一个
围绕视图勾勒出轮廓,以下是您将如何做到这一点:
#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;
#导入
-(id)initWithFrame:(CGRect)帧{
self=[super initWithFrame:frame];
如果(自我){
self.layer.borderWidth=2.f;
self.layer.borderColor=[UIColor redColor].CGColor;
}
回归自我;
我意识到这可能无法解决黑色背景显示的问题。这只是需要考虑的其他问题。设置
opaque = false // NO for ObjC
在视图上解决问题