为啥我的“initwithframe”变黑了? CGRect圆角绘图与initwithframe

Posted

技术标签:

【中文标题】为啥我的“initwithframe”变黑了? CGRect圆角绘图与initwithframe【英文标题】:Why is my "initiwithframe" turning up black? CGRect rounded corner drawing with initwithframe为什么我的“initwithframe”变黑了? CGRect圆角绘图与initwithframe 【发布时间】:2011-11-14 00:46:18 【问题描述】:

这就是它的样子。我想让黑色背景清晰,似乎无法弄清楚。

这是加载视图:

loadView  
  CGRect frame = CGRectMake(screenWidth - OFFSET, DEFAULT_PADDING, 140, 40);
  miniC* mcView = [ [ [miniC alloc] initWithFrame:frame] autorelease];
  mcView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin;
  [[self view] addSubview:mcView]; 

这里是我在 miniC 中调用 drawRect 的地方:

- (void)drawRect:(CGRect)rect 
    CGContextRef context = UIGraphicsGetCurrentContext();

    // Set Background Color & Border Color
    CGColorRef bgColor = [UIColor scrollViewTexturedBackgroundColor].CGColor; 
    CGColorRef borderColor = [UIColor grayColor].CGColor; 

    CGRect Rect = self.bounds;

    // Round Corners
    roundCorners(context, Rect);

    // Fill with bgcolor
    fillBackgroundColor(context, Rect, bgColor);

    // Add 1 px stroke
    CGRect strokeRect = Rect;
    strokeRect.size.height -= 1;
    strokeRect = (strokeRect);

    CGContextSetStrokeColorWithColor(context, borderColor);
    CGContextSetLineWidth(context, 1.0);
    CGContextStrokeRect(context, strokeRect);


    // Overlay Rect to Tint "scrollViewTexturedBackgroundColor" UIColor
    CGContextRef secondContext = UIGraphicsGetCurrentContext();

    // Set Background Color & Border Color
    CGColorRef obgColor = [UIColor colorWithRed:255/255 green:255/255 blue:255/255 alpha:.3].CGColor; 

    // Round Corners
    roundCorners(context, Rect);

    // Fill with bgcolor
    fillBackgroundColor(secondContext, Rect, obgColor);


代码用我正在寻找的笔划绘制圆角框,但新圆角框后面有一个黑框。我一直在尝试一堆不同的东西,但似乎无法弄清楚如何使背景颜色清晰。另外,我知道我可以使用 QuartzCore 做到这一点,但我不想这样做。

附:我是 Objective-c 的新手。

编辑:

void roundCorners(CGContextRef context, CGRect rect)

CGContextClearRect(context, rect);

CGFloat c = INSET + CORNER_RADIUS;

CGContextMoveToPoint(context, INSET, c);

CGContextAddArcToPoint(context, INSET, INSET, c, INSET, CORNER_RADIUS);    
CGContextAddLineToPoint(context, rect.size.width - c, INSET);
CGContextAddArcToPoint(context, rect.size.width - INSET, INSET, rect.size.width - INSET, c, CORNER_RADIUS);
CGContextAddLineToPoint(context, rect.size.width - INSET, rect.size.height - c);
CGContextAddArcToPoint(context, rect.size.width - INSET, rect.size.height - INSET, rect.size.width - c, rect.size.height -

插图,角半径); CGContextAddLineToPoint(context, c, rect.size.height - INSET);

CGContextAddArcToPoint(context, INSET, rect.size.height - INSET, INSET, rect.size.height > - c, CORNER_RADIUS);

CGContextClosePath(context);

CGContextClip(context);

CGContextSetFillColorWithColor(context, [UIColor scrollViewTexturedBackgroundColor].CGColor);
CGContextFillRect(context, CGRectMake(0, 0, rect.size.width - INSET, rect.size.height - INSET));

void fillBackgroundColor(CGContextRef context, CGRect rect, CGColorRef bgColor)

CGContextSetFillColorWithColor(context, bgColor);
CGContextFillRect(context, CGRectMake(0, 0, rect.size.width, rect.size.height));

【问题讨论】:

你记得让视图不透明吗? 绝对没有。我应该在哪里设置? 您可以将 'mcView.opaque = NO' 添加到您的 loadView 以确保就是这样。然后,如果这是唯一的问题,请将其移至 Paul 的 initWithFrame 。为你写的。 这很奇怪。只是为了检查,我复制并粘贴了你的代码,它对我来说很好用。因此,它必须是代码中不存在于您的问题中的内容。这里有什么用,给了我一个漂亮的圆角矩形,用亚麻布填充,没有黑色背景 如果您在此视图中所做的工作比您在此处显示的更多,我建议您将这些内容注释掉。把它归结为这个,你会看到它起作用,然后从那里重新构建。这通常对我有用。祝你好运! 【参考方案1】:

您需要设置UIView的背景颜色

例如

- (id)initWithFrame:(CGRect)frame

    self = [super initWithFrame:frame];
    if (self) 
        self.backgroundColor = [UIColor clearColor];
    
    return self;
   

其他一些需要考虑的东西,特别是当你说你对语言等方面的新知识时。

这个赋值 CGRect Rect = self.bounds; 是多余的,因为你被传递给 rect 作为方法参数,所以你可以删除它。

变量的名称CGRect Rect 在 Objective-C 中不是很好,因为以大写字母开头的东西通常是常量,所以这可能会造成混淆并在以后引起一些问题。

这个任务strokeRect = (strokeRect); 是多余的,它自己就可以完成这项工作strokeRect.size.height -= 1;

我可能是错的,我不是核心图形专家,但我假设 CGContextRef secondContext = UIGraphicsGetCurrentContext(); 将返回与您之前相同的上下文。

【讨论】:

是的,刚刚添加。我应该首先拥有。 也试过了。我是否在 loadView 中错误地实现了这一点? 您能说明您在哪里尝试过吗? loadView 的内容看起来不错。命名约定的问题再次出现在那里,因为您有一个具有不标准的小写首字母的类。类应以大写字母开头 是的,我几周前刚开始使用objective-c。清理背景仍然没有运气。我什至不确定我是否以正确的方式实现了这一点。我正在尝试使用该背景绘制一个视图,添加一个笔触,并在其中放置一个内部阴影。然后在该视图中,我将添加带有图片和标题的对象。这将是我视图顶部的微型幻灯片。非常感谢您的帮助。 感谢您的帮助。最终导致问题 [mcView setBackgroundColor: [UIColor whiteColor]];【参考方案2】:

CGContextClearRect 非常棘手。由于您的上下文是空的,因此除非必须,否则不应使用它。如果您确实使用它,重要的是您的视图的 backgroundColor 不应该是 100% 不透明的颜色:它的 alpha 必须小于 1。否则,它会绘制黑色(如您所见)而不是透明。

你展示的代码太多了,所以你只会让自己感到困惑,让那些想要帮助你的人感到困难。最好从一些非常简单的东西作为概念证明开始。这是一个非常简单的视图,它使用 CGContextClearRect 和剪裁将自身绘制为圆形矩形:

- (void) configure 
    self.backgroundColor = [[UIColor redColor] colorWithAlphaComponent:.99];


- (id)initWithFrame:(CGRect)frame

    self = [super initWithFrame:frame];
    if (self) 
        [self configure];
    
    return self;


- (id)initWithCoder:(NSCoder *)aDecoder 

    self = [super initWithCoder: aDecoder];
    if (self) 
        [self configure];
    
    return self;


- (void) drawRect: (CGRect) rect 
    CGContextRef con = UIGraphicsGetCurrentContext();
    CGPathRef p = [[UIBezierPath bezierPathWithRoundedRect:rect 
                                              cornerRadius:10] CGPath];
    CGContextAddRect(con, rect);
    CGContextAddPath(con, p);
    CGContextEOClip(con);
    CGContextClearRect(con, rect);

结果是一个红色的圆角矩形。但是... 将第一行中的 .99 更改为 1 ,视图的角会变成黑色,就像在您的图片中一样!这显示了在使用 CGContextClearRect 时非透明视图背景颜色的重要性。 (我认为这是一个错误,但这既不存在也不存在;这种情况已经存在很长时间了,我不希望事情会改变。)

【讨论】:

以上是关于为啥我的“initwithframe”变黑了? CGRect圆角绘图与initwithframe的主要内容,如果未能解决你的问题,请参考以下文章

SceneKit - 为啥添加聚光灯会使地板变黑?

flutter开发使用AnnotatedRegion修改状态栏字体颜色,导致导航栏也变黑了的解决方法

ccs界面黑色为啥会变黑,还有怎么调回白色?求解答

MPMoviePlayerViewController 进入后台变黑

Chrome界面变大怎么办 Chrome浏览器界面缩放的解决方法

为啥 webView.setWebChromeClient(new WebChromeClient());导致屏幕变黑?