RubyMotion и указатели

Я Objective-C noob, искал высокий и низкий, не найдя ответа на это:

В моем проекте RubyMotion у меня есть подкласс UIView, называемый StatusGuage, который содержит метод 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[] .

    Это должен быть указатель, который может быть достигнут таким образом ( ссылка на класс указателя )

     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

    места
    Местоположение для каждого цвета, предоставляемого компонентами. Каждое местоположение должно быть значением CGFloat в диапазоне от 0 до 1 включительно. Если 0 и 1 не находятся в массиве местоположений, Quartz использует цвета, которые наиболее близки к 0 и 1 для этих местоположений.
    Если местоположения NULL, первый цвет в цвете присваивается местоположению 0, последним цветным цветам присваивается местоположение 1, а промежуточным цветам назначаются местоположения с равными интервалами между ними.

    Interesting Posts

    UITapGestureRecognizer коснитесь self.view, но игнорирует subviews

    события удаленного управления monotouch не работают

    Как отображать видео с ALAsset на UICollectionview ios

    Обмен неизменяемыми NSStrings

    Как заставить Sprite Kit отображать @ 2x изображения из атласа в правильном размере?

    UIImageView, setClipsToBounds и то, как мои изображения теряют голову

    методы делегата с существенным изменением местоположения не называются

    Как определить ориентацию iPad в расширении клавиатуры iOS8

    AVAudioPlayer воспроизводит звуковой эффект

    Как инициализировать пользовательскую ячейку таблицы стилей прототипа в iOS 5 раскадровки?

    Добавление адресной книги на странице контактов

    Местное уведомление iOS: я хотел бы выполнить функцию при повторном входе в приложение через локальную notificaion

    Как сохранить видео с AVAssetExportSession в Camera Roll?

    Редактор помощника (Xcode 7.3) всегда показывает файл интерфейса в раскадровке, даже когда я выбираю вручную

    Возможно ли отменить приложения, загруженные с помощью iTunes из AppStore?

    Давайте будем гением компьютера.