Ios 没有正确绘制CG图形

Ios 没有正确绘制CG图形,ios,objective-c,core-graphics,Ios,Objective C,Core Graphics,刚开始使用核心图形,我可能不知道发生了什么 在下面的代码中,我试图创建一个小的圆形半透明黑色正方形,覆盖在UINavigationController的顶部,但到目前为止没有显示任何内容 UIView *notificationView = [[UIView alloc] initWithFrame:[[[self navigationController] view] frame]]; CGRect rect = CGRectMake(self.view.frame.size.width /

刚开始使用核心图形,我可能不知道发生了什么

在下面的代码中,我试图创建一个小的圆形半透明黑色正方形,覆盖在UINavigationController的顶部,但到目前为止没有显示任何内容

UIView *notificationView = [[UIView alloc] initWithFrame:[[[self navigationController] view] frame]];

CGRect rect = CGRectMake(self.view.frame.size.width / 2 - 50, self.view.frame.size.height / 2, 100, 100);
UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0.0);
[[UIColor colorWithWhite:0 alpha:0.5] setFill];

UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:10];
[path fill];

[notificationView setNeedsDisplay];

[[[self navigationController] view] addSubview:notificationView];
选项1(最有利于设计的选项)

ui视图
s实际上并不意味着其他对象可以进入其中。子类化
UIView
并让它在
drawRect
中进行自己的绘制,这在设计上更有意义。这样,您就不必在每次使用通知视图时都粘贴这么多代码

选项2(最简单,也可能是最好的选项)

如果您只需要一个半透明的黑色圆形矩形(我假设它是一个加载指示器),您可以通过以您想要的大小创建UIView并在视图中居中来更轻松地完成。将其背景色设置为半透明色,
[uicolorWithWhite:0.0 alpha:0.5]
。最后,添加行

notificationView.layer.cornerRadius = 10.0;
您可能还需要将
#import
放在头文件中,因为这是一个
CALayer
技巧

选项3(环形交叉口)

如果您真的想按您已经在做的方式来做,请将
notificationView
更改为
UIImageView
,然后将视图的边框设置为黑色圆形矩形的大小。然后在填充路径后添加以下内容:

UIImage *indicatorImage = UIGraphicsGetImageFromCurrentImageContext();
notificationView.image = indicatorImage;
您不再需要调用
setNeedsDisplay


希望其中一个听起来对你很好

此代码将在
drawRect
之外的任何位置失败,因为
UIGraphicsGetCurrentContext()
将返回
nil
。查看
UIGraphicsBeginImageContextWithOptions
OK我更新了代码,但仍然没有显示任何内容:/你真的需要更好地了解这些东西是如何工作的。我说的是“看看”,而不是“把它贴在那里”。这会将图像缓存(但您仍然需要对其进行处理)。但是,我看到您希望它显示在屏幕上。如果要绘制到导航控制器本身,则需要对其进行子类化并重写其
drawRect
方法。只有在该方法中才会
UIGraphicsGetImageContext()
返回非
nil
(您不需要在那里开始图像上下文)。几个小时后,我回到我的代码中,意识到我真的应该对其进行子类化,但选项2听起来也很棒,所以我将选择该选项:D谢谢!