RubyMotion和指针

Mid*_*ire 6 ruby ios rubymotion

我是一个Objective-C菜鸟,已经搜索了高低不能找到答案:

在我的RubyMotion项目中,我有一个名为StatusGuage的UIView子类,它包含一个名为drawLinearGradient的方法,如下所示:

def drawLinearGradient(context, rect, startColor, endColor)
  colorspace = CGColorSpaceCreateDeviceRGB()
  locations = [0.0, 1.0]
  # colors = NSArray.arrayWithObjects(startColor, endColor, nil)
  # ptrColors = Pointer.new(:object, colors)
  colors = [startColor, endColor, nil]
  # CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (CFArrayRef) colors, locations);
  CGGradientCreateWithColors(colorspace, colors, locations)
end
Run Code Online (Sandbox Code Playgroud)

我想知道如何调用CGGradientCreateWithColors.它显然需要一个(CFArrayRef)指针,但我无法弄清楚如何传入它.我尝试过的迭代之一被注释掉了.

这是错误消息:

2012-05-11 16:57:36.331 HughesNetMeter[34906:17903] 
*** Terminating app due to uncaught exception 'TypeError', 
  reason: 'status_guage.rb:43:in `drawLinearGradient:': expected 
  instance of Pointer, got `[0.0, 1.0]' (Array) (TypeError)
    from status_guage.rb:13:in `drawRect:'
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助.

Pau*_*l.s 9

有几件事.错误不是谈论颜色,而是指const CGFloat locations[]论点.

这应该是一个可以像这样实现的指针(Pointer类参考)

locations = Pointer.new(:float, 2)
locations[1] = 1.0
Run Code Online (Sandbox Code Playgroud)

接下来您的阵列不需要nil终止.在Ruby中,这将创建一个包含3个对象的数组,这不是您想要的,因为它最有可能导致CGGradientCreateWithColors()函数陷入困境


这看起来像是来自http://www.raywenderlich.com/的例子,所以这是其余部分

def drawLinearGradient(context, rect, startColor, endColor)
  colorspace = CGColorSpaceCreateDeviceRGB()
  locations = Pointer.new(:float, 2)
  locations[1] = 1.0

  colors = [startColor, endColor]
  gradient = CGGradientCreateWithColors(colorspace, colors, locations)

  startPoint = CGPointMake(CGRectGetMidX(rect), CGRectGetMinY(rect))
  endPoint   = CGPointMake(CGRectGetMidX(rect), CGRectGetMaxY(rect))

  CGContextSaveGState(context)
  CGContextAddRect(context, rect)
  CGContextClip(context)
  CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, 0)
  CGContextRestoreGState(context)
end
Run Code Online (Sandbox Code Playgroud)

最后的一面注意

locations参数甚至不要求在这种情况下,CGGradientCreateWithColors()会自动设定的值为0.0和1.0的第一和最后的颜色.检查CGGradient参考

位置
组件中提供的每种颜色的位置.每个位置必须是0到1(包括0和1)范围内的CGFloat值.如果0和1不在位置数组中,则Quartz使用提供的颜色最接近0和1的位置.
如果locations为NULL,则将颜色中的第一种颜色分配给位置0,将最后颜色的incolors分配给位置1,并为中间颜色分配位于其间的相等间隔的位置.