为啥我的“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的主要内容,如果未能解决你的问题,请参考以下文章
flutter开发使用AnnotatedRegion修改状态栏字体颜色,导致导航栏也变黑了的解决方法
MPMoviePlayerViewController 进入后台变黑
Chrome界面变大怎么办 Chrome浏览器界面缩放的解决方法
为啥 webView.setWebChromeClient(new WebChromeClient());导致屏幕变黑?