6

私はObjective-C初心者です。高低を検索しましたが、これに対する答えはまだ見つかりません:

私の RubyMotion プロジェクトには、次のような drawLinearGradient というメソッドを含む StatusGuage という UIView サブクラスがあります。

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) ポインターが必要ですが、それを渡す方法がわかりません。試した反復の 1 つがコメントアウトされています。

エラーメッセージは次のとおりです。

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:'

助けてくれてありがとう。

4

1 に答える 1

9

いくつかのこと。エラーは色について話しているのではなく、const CGFloat locations[]議論を参照しています。

これは、このように実現できるポインタである必要があります(ポインタクラスのリファレンス

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

最後のサイドノート

この場合、最初と最後の色の値が自動的に0.0と1.0に設定されるlocationsため、引数は必要ありません。CGGradientリファレンスCGGradientCreateWithColors()を確認してください

location
コンポーネントで提供される各色の場所。各場所は、0から1までの範囲のCGFloat値である必要があります。0と1がロケーション配列にない場合、Quartzは、それらのロケーションの0と1に最も近い提供された色を使用します。
場所がNULLの場合、色の最初の色は場所0に割り当てられ、最後の色の色は場所1に割り当てられ、間にある色には、その間に等間隔の場所が割り当てられます。

于 2012-05-11T23:45:29.347 に答える