Приведенный ниже код рисует прямые линии между точками на UIImageView. Рисунки визуализируются быстро и хорошо выглядят, но могут быть намного лучше, поэтому я хочу изменить код для создания плавных кривых линий. Я исследовал ряд примеров в Swift за последние шесть недель с нулевым успехом.Как нарисовать гладкие линии внутри UIImageView с Swift?
Какие разделы нижеследующего кода я должен изменить (и как) для достижения этого, пожалуйста? Мне сказали, что при вызове нижеприведенного фрагмента вместо CGContextAddLineToPoint() (в // 2 ниже) должен сделать трюк, но я не понимаю, как его вызвать и как он относится к текущему коду целиком.
SNIPPET:
func drawQuadLineWithPoints(firstPoint: CGPoint, secondPoint: CGPoint, thirdPoint: CGPoint, inContext: CGContext) {
CGContextMoveToPoint(context, 0.5 * (firstPoint.x + secondPoint.x), 0.5 * (firstPoint.y + secondPoint.y));
CGContextAddQuadCurveToPoint(context, secondPoint.x, secondPoint.y, 0.5 * (secondPoint.x + thirdPoint.x), 0.5 * (secondPoint.y + thirdPoint.y));
}
КОД:
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
swiped = false
if let touch = touches.anyObject() as? UITouch {
lastPoint = touch.locationInView(self.view)
}
}
func drawLineFrom(fromPoint: CGPoint, toPoint: CGPoint) {
// 1
UIGraphicsBeginImageContext(view.frame.size)
let context = UIGraphicsGetCurrentContext()
tempImageView.image?.drawInRect(CGRect(x: 0, y: 0, width: view.frame.size.width, height: view.frame.size.height))
// 2
CGContextMoveToPoint(context, fromPoint.x, fromPoint.y)
CGContextAddLineToPoint(context, toPoint.x, toPoint.y)
// 3
CGContextSetLineCap(context, kCGLineCapRound)
CGContextSetLineWidth(context, brushWidth)
CGContextSetRGBStrokeColor(context, red, green, blue, 1.0)
CGContextSetBlendMode(context, kCGBlendModeNormal)
// 4
CGContextStrokePath(context)
// 5
tempImageView.image = UIGraphicsGetImageFromCurrentImageContext()
tempImageView.alpha = opacity
UIGraphicsEndImageContext()
}
override func touchesMoved(touches: NSSet, withEvent event: UIEvent) {
// 6
swiped = true
if let touch = touches.anyObject() as? UITouch {
let currentPoint = touch.locationInView(view)
drawLineFrom(lastPoint, toPoint: currentPoint)
// 7
lastPoint = currentPoint
}
}
override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
if !swiped {
// draw a single point
drawLineFrom(lastPoint, toPoint: lastPoint)
}
// Merge tempImageView into mainImageView
UIGraphicsBeginImageContext(mainImageView.frame.size)
mainImageView.image?.drawInRect(CGRect(x: 0, y: 0, width: view.frame.size.width, height: view.frame.size.height), blendMode: kCGBlendModeNormal, alpha: 1.0)
tempImageView.image?.drawInRect(CGRect(x: 0, y: 0, width: view.frame.size.width, height: view.frame.size.height), blendMode: kCGBlendModeNormal, alpha: opacity)
mainImageView.image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
tempImageView.image = nil
}
Замечательно! Большое спасибо за Вашу помощь. Ваш ответ помог установить контекст, в котором необходимо было внести изменения в предыдущий код. Будучи программистом вкл/выкл, Swift является новым для меня (начало 2015 года), и я все еще участвую. Это была не простая копия, так как я, кажется, использую Swift 1.1 (я очень скоро обновляюсь!), Но по строкам я мог видеть необходимые изменения и реализовывать их. Лучше всего, решение получается гладким и быстрым. Еще раз спасибо, очень признательны! Проголосовать! – user4806509
Я рад, что я облако справился :) – Bjqn