2015-08-17 4 views
1

У меня есть массив объектов CGPoint. Массив представляет строку. Элемент 0 является исходной точкой этой строки. Элемент 1 - это следующая точка и так далее. Я знаю, какой цвет и толщина в пикселях я хочу передать линии. Я хочу получить UIImage, который содержит эту строку. Я думаю о том, чтобы сделать что-то вроде этого:Получить UIImage из массива точек

// Get graphics context 
UIGraphicsBeginImageContextWithOptions(imageSize, false, 1.0) 

// Draw line 
let line = UIBezierPath() 
if let startingPoint = points.firstObject as? CGPoint { 
    line.moveToPoint(startingPoint) 
} 

for point in points { // Would I need to ignore the first point? 
    if let point = point as? CGPoint { 
     line.addLineToPoint(point) 
    } 
} 

// Obtain image and save to file 

// End graphics context 
UIGraphicsEndImageContext() 

Будет ли это работать? Есть ли стандартный или лучший способ сделать это? Не стесняйтесь ответить на Objective C :)

+0

Где 'points' взялось? Почему это не '[CGPoint]' (вы должны 'if let' в' CGPoint')? – nhgrif

+0

точки NSArray возвращены из закрытой исходной структуры, написанной в obj-C. Должен ли я сначала конвертировать в [CGPoint]? Каковы преимущества? –

ответ

1

Если вы хотите для использования UIBezierPath, вам нужно пройти через точки. Но вы, вероятно, хотите двигаться к первой точке, а затем добавить последующие пункты:

line.moveToPoint(points.first!) // assumes points is never empty, otherwise use an if let or other guard 
for point in points[1..<points.count] { // skip the first one 
    line.addLineToPoint(point) 
} 

Или вы можете использовать генератор:

var stream = points.generate() 
line.moveToPoint(stream.next()!) // assumes points is never empty, otherwise use an if let or other guard 
while let point = stream.next() { 
    line.addLineToPoint(point) 
} 

Одним из преимуществ @John Tracid ' что вы можете использовать функции CGContextRef. Хотя UIBezierPath не имеет удобную функцию для построения сегмента полилинии N из N + 1 массив точек, CGContextRef делает:

CGContextAddLines(bitmap, points, points.count) // might need a magical cast here 
1

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

CGFloat imageWidth = 100; 
CGFloat imageHeight = 100; 

// create bitmat with prarameters you need 
CGContextRef bitmap = CGBitmapContextCreate(...); 
CGContextBeginPath(bitmap); 

// your drawing here 

// result image 
CGImageRef newImageRef = CGBitmapContextCreateImage(bitmap); 
UIImage *newImage = [UIImage imageWithCGImage:newImageRef]; 

// Clean up 
CGContextRelease(bitmap); 
CGImageRelease(newImageRef); 
+0

Делает смысл. И что вы думаете о моем коде Draw Line? –

+0

@JonSetting вы можете использовать функции CoreGraphics вместо 'UIBezierPath', потому что это всего лишь оболочка. Также, если вам не нужна кривая, лучше использовать прямые линии. –

Смежные вопросы