Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/97.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UIView重写drawRect会导致视图不服从masksToBounds_Ios_Uiview_Ios6_Drawrect - Fatal编程技术网

Ios UIView重写drawRect会导致视图不服从masksToBounds

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

我正在尝试覆盖自定义视图中UIView的
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:
会导致性能下降。我还没有分析它, 所以我不知道在正常情况下这是否是一个显著的表现 环境(可能不是),但在大多数情况下 override
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;
#导入
-(id)initWithFrame:(CGRect)帧{
self=[super initWithFrame:frame];
如果(自我){
self.layer.borderWidth=2.f;
self.layer.borderColor=[UIColor redColor].CGColor;
}
回归自我;
我意识到这可能无法解决黑色背景显示的问题。这只是需要考虑的其他问题。

设置

opaque = false // NO for ObjC
在视图上解决问题