5

Я настраиваю свой BEMSimpleLineGraph и смог сделать это успешно, за исключением затенения линейного градиента. После того, как этот код ссылки в указанном примере Obj-C проектCGContextDrawLinearГрадиент, вызывающий EXC_BAD_ACCESS

CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB(); 
    size_t num_locations = 2; 
    CGFloat locations[2] = { 0.0, 1.0 }; 
    CGFloat components[8] = { 
     1.0, 1.0, 1.0, 1.0, 
     1.0, 1.0, 1.0, 0.0 
    }; 
    self.myGraph.gradientBottom = CGGradientCreateWithColorComponents(colorspace, components, locations, num_locations); 

и транскрибировать его к этому в Swift:

let colorspace:CGColorSpaceRef = CGColorSpaceCreateDeviceRGB() 
     let num_locations:size_t = 2 
     var locations: [CGFloat] = [0.0, 1.0] 
     var components: [CGFloat] = [ 
      1.0, 1.0, 1.0, 1.0, 
      1.0, 1.0, 1.0, 0.0 
     ] 

     self.myGraph.gradientBottom = CGGradientCreateWithColorComponents(colorspace, components, locations, num_locations) 

все строит правильно, но бросает ошибку памяти EXC_BAD_ACCESS в файле BEMLine.m включены, остановка на этой линии

CGContextDrawLinearGradient(ctx, self.bottomGradient, CGPointZero, CGPointMake(0, CGRectGetMaxY(fillBottom.bounds)), 0); 

я включил в Obj-C мостовую заголовок, добавлены рамки CoreGraphics, включен нижний цвет в атрибуты панели повторно Spectric ViewController в Storyboard, ссылается на страницы разработки Apple, чтобы обеспечить правильные типы данных всех параметров, но я все еще высыхаю. При проверке сходства ошибок я также понял, что та же ошибка возникает при попытке нарисовать верхний линейный градиент. Ошибка, похоже, лежит в коде Obj-C, который пытается нарисовать градиент, но опять-таки я не понимаю, что делать.

+0

разделить полный отчет о сбое (файл '.crash')? –

+0

@ JohannesWeiß спасибо, что ответив! Я загрузил его здесь для вас: (https://drive.google.com/file/d/0ByFqolB5nSXKU1JhYjlYVlpjWTQ/view?usp=sharing) –

+0

У меня был вид, и похоже, что 'self.bottomGradient' не ноль/NULL, но указывает на бит памяти, который не содержит допустимого градиента. –

ответ

5

У меня была такая же проблема при использовании BEMSimpleLineGraph из Swift. К счастью, я нашел ответ на странице вопросов библиотек Github:

https://github.com/Boris-Em/BEMSimpleLineGraph/issues/105

Для того, чтобы решить эту проблему, я просто объявил глобальный градиент в Swift класса, например, так:

var gradient : CGGradient? 

и просто заменить линию

self.myGraph.gradientBottom = CGGradientCreateWithColorComponents(colorspace, components, locations, num_locations) 

с:

self.gradient = CGGradientCreateWithColorComponents(colorspace, components, locations, num_locations) 
self.myGraph.gradientBottom = self.gradient 

Очевидно, что градиент в противном случае не останется выделенным в памяти и в то время, когда библиотека должна его использовать, он больше не доступен.

+0

решил мою проблему! Спасибо mjrehder! –

0

Одна вещь, которую я отмечаю, заключается в том, что в коде установки вы используете self.myGraph.gradientBottom, а в коде чертежа вы используете self.bottomGradient.

Должны ли они быть такими же? Или вы забыли присвоить значение последнему?

+0

Код self.bottomГрадиентный рисунок был Obj-C, предварительно предоставленным библиотекой диаграмм BEMSimpleLineGraph, поэтому я не уверен, что это проблема, но я ценю ответ –