2016-10-17 2 views
0

Я хочу добавить UIImage в последний момент UIBezierPath, как на картинке ниже:UIImage в последней точке UIBezierPath

Circle Path

Код:

let consume = 0.25 
let x = self.frame.size.width/2.0 
let y = self.frame.size.height/2.0 
let radius = (frame.size.width - 10)/2.0 
let startAngle: CGFloat = CGFloat(M_PI * (-1/2)) 
let endAngle = CGFloat(M_PI * 2 - M_PI/2 * consume) 
let circlePath = UIBezierPath(arcCenter: CGPoint(x: x, y: y), radius: radius, startAngle: startAngle, endAngle: endAngle, clockwise: false) 

circleLayer = CAShapeLayer() 
circleLayer.path = circlePath.cgPath 
circleLayer.fillColor = UIColor.clear.cgColor 
circleLayer.strokeColor = UIColor.red.cgColor 
circleLayer.lineWidth = 8.0; 

let image = UIImage(named: "myCoolImage") 
let imageView = UIImageView(image: image) 
// coordX and coordY must be at last point of UIBezierPath 
imageView.frame = CGRect(x: coordX, y: coordY, width: 20.0, height: 20.0) 
self.addSubview(imageView) 

Я попытался следующие:

let coordX: CGFloat = cos(endAngle) * radius 
let coordY: CGFloat = sin(endAngle) * radius 

Результат: Positive coordX and coordY

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

+0

В коде, которое вы использовали, что не так? Какой результат вы сейчас видите? Кажется, что все, что вам не хватает, это отрицательное смещение для размера изображения (так, местоположение -x, -y для размера изображения). – shortstuffsushi

+0

Я обновил вопрос с моим текущим результатом. Если я устанавливаю отрицательное смещение, мое изображение выходит из экрана. –

+0

Вы не показываете здесь, где вы меняете координаты и координаты, чтобы дать вам этот результат. Обратите внимание, что эти значения должны основываться на x и y_, поэтому это x/y (центр) +/- cos/sin (угол). Можете ли вы показать обновленный код с установленными переменными и отметив, что они должны быть основаны на х/у? – shortstuffsushi

ответ

1

Для того, чтобы иметь фактический, полностью сложенный ответ, вот в основном то, что вам нужно.

let consume = 0.25 
let x = self.frame.size.width/2.0 
let y = self.frame.size.height/2.0 
let radius = (frame.size.width - 10)/2.0 
let startAngle: CGFloat = CGFloat(M_PI * (-1/2)) 
let endAngle = CGFloat(M_PI * 2 - M_PI/2 * consume) 
let circlePath = UIBezierPath(arcCenter: CGPoint(x: x, y: y), radius: radius, startAngle: startAngle, endAngle: endAngle, clockwise: false) 

circleLayer = CAShapeLayer() 
circleLayer.path = circlePath.cgPath 
circleLayer.fillColor = UIColor.clear.cgColor 
circleLayer.strokeColor = UIColor.red.cgColor 
circleLayer.lineWidth = 8.0; 

let imageSize = 20.0 
// Center + cos/sin(angle) * radius, then subtract half 
// the image size so it will be centered on the line 
let coordX: CGFloat = x + (cos(endAngle) * radius) - (imageSize/2.0) 
let coordY: CGFloat = y - (sin(endAngle) * radius) - (imageSize/2.0) 

let image = UIImage(named: "myCoolImage") 
let imageView = UIImageView(image: image) 
// coordX and coordY must be at last point of UIBezierPath 
imageView.frame = CGRect(x: coordX, y: coordY, width: imageSize, height: imageSize) 
self.addSubview(imageView) 
Смежные вопросы