Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.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()外部绘制UIBezierPath?_Ios_Swift_Core Graphics_Uigraphicscontext - Fatal编程技术网

Ios 在UIView::drawRect()外部绘制UIBezierPath?

Ios 在UIView::drawRect()外部绘制UIBezierPath?,ios,swift,core-graphics,uigraphicscontext,Ios,Swift,Core Graphics,Uigraphicscontext,我试图在视图边缘画一组小圆圈,以镜像我在应用程序中控制的物理灯光(像素)。这些圆圈会经常改变颜色。所以我创建了一个PixelSimulator对象,将每个圆绘制成一个自定义UIView对象 这是相关代码 class PixelSimulator { let size: CGSize; let color: UIColor; let pixelPath: UIBezierPath; init (point: CGPoint, size: CGSize, pixel: Pixel)

我试图在视图边缘画一组小圆圈,以镜像我在应用程序中控制的物理灯光(像素)。这些圆圈会经常改变颜色。所以我创建了一个PixelSimulator对象,将每个圆绘制成一个自定义UIView对象

这是相关代码

class PixelSimulator {
  let size: CGSize;
  let color: UIColor;
  let pixelPath: UIBezierPath;

  init (point: CGPoint, size: CGSize, pixel: Pixel) {
    self.point = point;
    self.size = size;
    self.pixel = pixel;

    pixelRect = CGRect(origin: point, size: size);
    pixelPath = UIBezierPath(ovalInRect: pixelRect);

    color = pixel.color;
  }

  func render () {
    UIGraphicsBeginImageContext(size);

    color.setFill();
    pixelPath.fill();

    UIGraphicsEndImageContext();
  }
}
我使用
CGContextAddEllipseInRect(context,pixelRect)
尝试了一种不同的方法,但没有效果。我还尝试在
render()
方法中声明pixelPath,但同样无效


我需要做什么更改才能随时将bezierPath绘制到屏幕上,在
drawRect()内部还是外部?

我会删除图像上下文,直接绘制。我将仅从内部draw rect调用
render

当颜色发生变化时,我会更新相应的模拟器,并发布通知,让“系统”知道发生了这种情况。在这种情况下,通知是合适的,因为您不想知道对更改事件感兴趣的是什么,系统中的多个事物可能感兴趣


当视图控制器收到通知时,它只需在视图上调用
setNeedsDisplay
,这将导致模拟器在下一个绘制周期中呈现。

我会删除图像上下文,直接绘制。我将仅从内部draw rect调用
render

当颜色发生变化时,我会更新相应的模拟器,并发布通知,让“系统”知道发生了这种情况。在这种情况下,通知是合适的,因为您不想知道对更改事件感兴趣的是什么,系统中的多个事物可能感兴趣


当视图控制器收到通知时,它只需在视图上调用
setNeedsDisplay
,这将导致模拟器在下一个绘制周期中呈现。

您对图像上下文的计划是什么?您何时调用渲染?当相应的物理灯光的颜色发生变化时,我将调用
render()
。从何处开始?在draw rect中?是否将视图设置为在更改时显示?我不会使用图像上下文,我会直接绘制到视图或图层。物理灯光的颜色会在应用程序的其他地方更改。实际上,当物理灯光的颜色发生变化时,相应的
PixelSimulator
color
会发生变化以匹配,并调用
render()
。这发生在
drawRect()之外。如果每次颜色变化时我都画一个图层,我不是会有很多图层吗?那会是个问题吗?如果不是的话,你能给出一个答案来解释怎么做吗?你对图像背景的计划是什么?您何时调用渲染?当相应的物理灯光的颜色发生变化时,我将调用
render()
。从何处开始?在draw rect中?是否将视图设置为在更改时显示?我不会使用图像上下文,我会直接绘制到视图或图层。物理灯光的颜色会在应用程序的其他地方更改。实际上,当物理灯光的颜色发生变化时,相应的
PixelSimulator
color
会发生变化以匹配,并调用
render()
。这发生在
drawRect()之外。如果每次颜色变化时我都画一个图层,我不是会有很多图层吗?那会是个问题吗?如果不是的话,你能给出一个答案来解释它是如何工作的吗?这种方法可能比我想象的要有效得多。非常感谢。这种方法很有效,可能比我想象的要有效得多。非常感谢。