簡體   English   中英

RubyMotion和指針

[英]RubyMotion and Pointers

我是一個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

我想知道如何調用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:'

謝謝你的幫助。

有幾件事。 錯誤不是談論顏色,而是指const CGFloat locations[]參數。

這應該是一個可以像這樣實現的指針( Pointer類參考

locations = Pointer.new(:float, 2)
locations[1] = 1.0

接下來您的陣列不需要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

最后的一面注意

在這種情況下甚至不需要locations參數,因為CGGradientCreateWithColors()會自動將值設置為0.0和1.0,用於第一種顏色和最后一種顏色。 檢查CGGradient參考

地點
組件中提供的每種顏色的位置。 每個位置必須是0到1(包括0和1)范圍內的CGFloat值。 如果0和1不在位置數組中,則Quartz使用提供的顏色最接近0和1的位置。
如果locations為NULL,則將顏色中的第一種顏色分配給位置0,將最后顏色的incolors分配給位置1,並為中間顏色分配位於其間的相等間隔的位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM